响应式数据的说明
响应式数据: 把data中的数据挂到vm身上,vm身上的这个数据其实就是响应式的
一旦数据发生了改变,页面中的内容也会跟着改变
$set的使用
- data中的数据一定要先声明,再使用,动态给对象添加的属性不是响应式的
1 | <div id="app"> |
- 如果想要动态绑定数据,并且是响应式的,需要使用
vm.$set方法
1 | this.$set(this.person, 'gender', '男') |
结论:
- 如果是对象,动态给对象添加或者删除一个属性,vue是检测不到的,所以不是响应的,如果想用动态添加的数据是响应式,需要使用
Vue.set(obj, key, value)vm.$set(obj, key ,value) - 如果是数组,通过数组的下标或者是数组的长度,vue也是检测不到,所以操作也不是响应式的
- 使用
Vue.set方法 - 数组的变异的方法,这个方法会改变原数组,能够触发vue的更新。
- 使用
异步DOM更新以及$nextTick的说明
在vue中数据发生了改变,DOM中的数据也会跟着发生改变,但是这个过程是异步的
vue的数据发生改变之后,DOM不会立即更新,会等到下一次渲染工作执行的时候才会更新DOM
目的:为了提高渲染的性能
1 | clickFn () { |
$nextTick方法会在DOM更新之后执行
1 | // 在实际开发中,有可能需要在数据改变之后,获取到更新之后的DOM数据 |
组件化开发
组件的概念
组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。
在vue中都是组件化开发的,组件化开发就是把一个完整的页面分割成一个一个的小组件。
组件的优点:
- 容易维护
- 复用
1 | vue组件分为全局组件和局部组件 |
全局组件
- 定义
1 | // 要注册一个全局组件,可以使用 Vue.component(tagName, options)。 |
- 使用
1 | 全局组件可以在所有的实例中使用 |
- 注意点:组件的模板有且仅有一个根元素
1 | template: '<h3>我是全局组件!</h3><p>有两个根元素</p>'; // 错误的用法 |
- 如果有很多的内容,template可以使用字符串模版
1 | Vue.component("my-button", { |
局部组件
1 | // 在vue实例的内部,通过components属性来定义局部组件 |
组件是特殊的vue实例
可以将组件看成是一个vue的实例,因此,在vue实例中能配置的属性,在组件中依旧能够配置。
比如:data,method,watch,computed,钩子函数等
注意:组件中data属性必须是一个函数,返回值才是data的数据
1 | // 可以把组件看成一个vue实例 |
- 组件是一个独立封闭的个体,组件之间的数据是无法相互使用的
1 | var vm = new Vue({ |
组件通讯
因为组件是一个独立的个体,组件无法使用到外部的数据
但是在真实开发中,多个组件之间是需要相互使用彼此的数据的,因此需要使用组件通讯的技术,让组件之间能够相互传值。
组件通讯分为三类
- 父组件传递值给子组件
- 子组件传递值给父组件
- 非父子组件之间的传值
组件通讯-父传子
- 定义两个组件
1 | Vue.component("parent", { |
- 组件的通讯
1 | 1. 在父组件的模版中,给子组件增加一个自定义的属性。 |
注意:props负责获取父组件的传递过来的,props中的值是只读的,不允许修改
组件通讯-子到父
参考链接:https://blog.csdn.net/jsxiaoshu/article/details/79058940
整体思路
1 | 1. 父组件给子组件注册一个自定义事件 |
- 父组件给子组件注册事件
1 | <son @fn='getData'></son> |
- 子组件触发自定义事件,并且把要传递的数据作为参数进行传递
1 | // $emit可以出发当前实例的事件 |
- 父组件获取值
1 | methods: { |