下载使用element-ui
控制全局滚动条的样式, 直接添加在App.vue里面即可
element-ul里面的el-rate组件有:max显示几颗星, show-score显示分数的属性
element-ul里面的el-select有个multiple可以进行多选
::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-thumb { background-color: #a1a3a9; border-radius: 3px; }模型Category,分为name: String, parent: mongoose.SchemaTypes.ObjectId,在前端的vue里面就只需要定义一个cateValue为空对象即可,在双向绑定数据的时候直接v-model=cateValue.name,v-mdoel=cateValue.parent。就不能像下面这样定义了。
data () { return { cateValue: { name: '', parent: '' } } }或者写成下面的形式也可以, 不过好像很少见
data () { return { cateValue: { name: null, parent: null } } }因为这样会使parent的值类型变成了String类型而当parent为空时就无法提交新的分类。就会出现无法强制转换类型的错误
在写上返回状态码之后只有200才可以被前端接受到, 而403, 404的状态码返回就会直接在控制台报错
res.json({}) // 可以获得res res.status(403).json({}) //报错使用axios这个插件的时候如果每个单文件请求都写http://localhost...之类的就太长了, 所以就直接使用它的一个方法
const axios = require('axios') const http = axios.create({baseURL: 'http://localhost:8000'}) module.exports = http /****/ Vue.prototype.$http = http /****/ this.$http.get('/rest/...')将导出的方法变成Vue原型对象上的方法, 这样在其它vue单文件组件里就可以直接使用了, 而不需要再引入axios这个包, 这里获取这个默认根地址是$http.defaluts.baseURL
有专门的富文本编辑插件vue2-editor
axios 拦截器
vue使用插槽slot
//子组件 <slot :item="item"></slot> //父组件 <template slot-scope="prop"> <div>{{prop.item}}</div> </template> // 2.6以前的写法 //子组件 <slot name="items" :item="Categories"></slot> //父组件 <template #items{item}> <div v-for="value in item">value<div> </template> //2.6以后的动态插槽名, #为v-slot的缩写对于两个页面共用同一个组件, 可能出现数据没有变化或者清空
<router-view :key="$route.path"></router-view> watch () { '$route()' { //判断参数 if(!this.$route.params.id) { } } } //自己写的, 缺点:复用的组件都需要写上聚合查询
对于swiper这个组件里有默认的事件<swiper @slide-change></swiper>
使用swiper每一个滑动页的高度不一样使用autoHeight:true这个参数来控制
使用map来遍历数据控制台报错, 可能是数据本身的原型链上不包含map方法
这里需要注意的是, 子路由在使用父路由的请求参数是需要加上mergeParams参数的, 来合并参数的
const router = express.Router({ mergeParams: true })根据不同的请求就可以生成不同接口再配合规范命名,使用inflection包来处理单词的单复数问题。 require('inflection').classify(req.params.resource) 就可以将大写的转化成小写复数的形式
这里不能直接写在底层路由的前面, 需要写成中间件的形式, 每个底层路由前都需要执行转换下
const express = require('express') const router = express.Router() const Router = require('./admin/category') router.use('/rest/:resource', async (req, res, next) => { const modelName = require('inflection').classify(req.params.resource) req.Model = require(`../modle/${modelName}`) next() }, Router) module.exports = router这样就可以通过http://localhost:8000/uploads/图片名在前端页面中访问到并且渲染出来
mongoose模型里的集合可以直接创建子集, 例如以下
skills: [{ icon: {type: String}, name: {type: String}, description: {type: String}, tips: {type: String} }], partners: [{ hero: {type: mongoose.SchemaTypes.ObjectId, ref: 'Hero'}, description: {type: String} }]在mongoose里定义的模型的属性, 当作为返回值的时候, 如果对象或者字符串为空的话,那这两个属性不会随着res返回给前端。空数组的属性也会返回
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象,可以多个对象的合并, 用于对象的赋值
有path就会与parmas冲突
将之前的res.json()发送改为res.send(),json()返回json格式的,send返回任何类型
感谢b站的 全栈之巅 老师