1.组件化开发
1.1 组件化的基本使用
简单的组件示例
1 | <div id="app"> |
组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是 my-cpn
。我们可以在一个通过 new Vue
创建的 Vue 根实例中,把这个组件作为自定义元素来使用: <my-cpn></my-cpn>
。
1.1.1 创建组件构造器对象
template
中是组件的DOM元素内容。
1.1.2 注册组件
-
全局注册
Vue.component('给组件取得名字', 组件对象)
可以在多个vue实例中使用,类似于全局变量。
-
局部注册
components:{'给组件取得名字', 组件对象}
只能在当前vue实例挂载的对象中使用,类似于局部变量,有块级作用域。
1.1.3 使用组件
<给组件起的那个名字></给组件起的那个名字>
补充:注册组件的语法糖
注册组件时候可以不实例化组件对象,直接在注册的时候实例化。{}
就是一个组件对象,如下代码:
1 | <div id="app"> |
1.2 组件模板分离的写法
为了不在js代码中写很多html代码,将组件模板抽离出来
1.2.1 script标签
使用script
标签定义组件的模板,script
标签注意类型是text/x-template
。
1 | <!-- 1.script标签注意类型是text/x-template --> |
1.2.2 template标签(重要!)
使用template
标签,将内容写在标签内。
1 | <!-- 2.template标签 --> |
1.2.3 进一步分离
如上图所示,那么实际上可以把绿色部分的那部分代码保存到另外一个js文件中,然后在本文件中引入即可。
需要注意的是:直接用浏览器打开index.html看不到效果(会出现跨域问题),需要开启一个服务器
1 | npm install http-server |
还是不够好,在cpn.js
中模板和js代码还是在一起,没有分离,那么终极大法来了,接着看。
1.2.4 终极大法(.vue文件来了)
1.3 为什么组件的data必须要是函数?
来,先看效果(需要http-server)
图中可以看到,不使用data
的好像共用一个count
属性,而使用函数的data
的count是各自用各自的,像局部变量一样有块级作用域,这个块级就是vue组件的作用域。
我们在复用组件的时候肯定希望,各自组件用各自的变量,如果确实需要都用一样的,可以全局组件注册,也可以是用vuex来进行状态管理。
1.4 父组件向子组件传值
-
在子组件中使用
props属性
props属性使用
数组写法
1 | props: ['cmovies', 'cmessage'] |
对象写法
1 | props: { |
props属性的类型限制
1 | //1.类型限制(多个类使用数组) |
props属性的默认值
1 | // 2.提供一些默认值,以及必传值 |
props属性的必传值
1 | cmessage: { |
类型是Object/Array,默认值必须是一个函数
1 | //类型是Object/Array,默认值必须是一个函数 |
自定义验证函数
1 | vaildator: function (value) { |
自定义类型
1 | function Person(firstName,lastName) { |
1.5 子组件向父组件传值 (观察者模式的使用)
-
在子组件中使用
this.$emit('方法名',要传递数据)
原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去。
1.6 使用ref获取DOM元素和组件引用
Vue属于MVVM框架,也就是数据驱动框架,所以通常是以数据驱动的形式去开发,它就是为了尽最大努力地避免DOM操作,解放程序员的双手。但是,有时候,我们不可避免地会进行DOM操作,那么Vue也提供了ref属性来直接获取DOM元素。