近些日子上手vue全家桶,深感自己的知识水平浅薄,在摸索之中记录了我遇到的一些问题的解决方法。
场景:表单需要打开新页面修改参数返回保存数据
这个一开始我就想利用vuex
的store存储到state之中就大功告成了。
然而发现事情并没有那么简单,自己原来的js写法是利用oninput
事件进行记录用户输入的内容。但是兼容性并不是特别好。
几天前搜索的时候发现了一个更好的方法:
先提取store中的数据传给computed
计算属性,然后再把这个值传给v-model
用于表单的数据绑定,最后再为这个计算属性增加一个setter
,在表单数据变化的时候对值进行commit
提交,从而达到数据的实时更新的效果。
参考问答:请问vue的html标签可以用v-model来改变store中的state吗?
refs的一些应用场景
在vue之中因为vm.$el
的存在就可以利用ref替代原来的dom操作了。
但是有些情况refs还是会出现问题的。
首先不要再mounted
钩子之前调用,这样的话因为要获取的对象并没有挂载到实例上而导致失败。
另外还有一种情况就是,不要在响应式的渲染之中(个人的失败经历:条件渲染v-if和循环v-for)使用获取ref注册的元素或组件。
虽然在控制台之中可以看到this.$refs
包含了你要获取的对象,但是你在实际调用之中会获取失败。
这也是在vue官方文档里进行了说明:
关于ref注册时间的重要说明: 因为ref本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 – 它们还不存在!
$refs
也不是响应式的,因此你不应该试图用它在模版中做数据绑定。
对于这种情况我们可以有以下两种方法进行变通处理:
直接为元素添加id通过原始dom进行操作处理
通过nextTick进行渲染后的refs获取,这样就不会出现获取失败的情况。
对于nextTick的官方说明如下
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM