今年7月开始,项目由老旧的freemarker+dojo+jQuery修改成了前后端分离的Vue+elementui,对开发来说是件好事,前后端分离意味着并不需要互相前后端同事不需要互相等待。只要数据结构确定下来了,就可以各自完成各自的工作,最后调一下接口就好,前端可以mock数据用于测试。刚开始用肯定会有很多问题。
首先我们需要学习es6+的知识。其中promise、字符串模板、Array中新增的遍历的方法和箭头函数等,虽然知识点不多,只是用处很大,也都值得深挖。
vue中碰到的几个问题。
- 循环中的key的作用
- 双向修改值或者互相引用对象。
实际项目开发的时候,肯定会使用很多的组件,而且还有可能是组件套着组件的,这时候避免不了的去传递参数,写代码的时候经常不经意的把传递的参数就修改了,但是这时候访问页面console会报错,我们可以追踪下到底是哪个参数被修改。我这里经常出现的一个问题是这样的: 表单数据如下:
formdata:{
id:'',
name:'',
group:{
id:'',
name:'',
models:[]
}
}
页面第一次载入的时候会把formdata.group 设置成group列表的第一个选项,(group为下拉单选框),v-model设置成formdata.group.id, 选择以后其他的发现选中状态有两个,其实在赋值过程中默认给id了一个值,选择其他的以后会把列表中的值修改掉,列中中会出现两个id相同的group。所以会导致有两个选中状态的下拉数据。
$emit 和 $on
使用事件总线传值时,$emit 和$on方法是存在先后顺序的,必须是$on事件监听的绑定要在$emit事件发送之前建立,否则就是能监听到事件,但是传递的值也会丢失。
- 样式不生效
使用其他ui库的时候,避免不了要去修改本身ui组件的样式,样式中如果加scoped,则不会生效,这种全局修改的样式最好放到一个文件,全局引入。
- watch内部属性不生效
完整的深度watch监听:
data:{
handler(val){
.....
},
immediate:true,
deep:true //是否深度监听
}
handler:为监听属性变化后的处理方法。 deep:为是否深度监听 immediate:为是否立即执行,这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。
后续会补充其他