vue学习之路 - 5.进阶(vue组件)
vue 组件
组件概念
Vue中的组件思想借鉴自React
■ 目前的主流前段框架:Angular、Vue、React都是组件化开发思想
■ 组件是对局部视图的封装
◆ HTML结构
◆ CSS样式
◆ Java Script行为
● data数据
● methods行为
作用:提高开发效率,增强可维护性,享受编程的乐趣。
初始 vue 组件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue 组件初识</title> </head> <body> <script src="node_modules/vue/dist/vue.js"></script> <script> // 定义名为 todo-item 的新组件 Vue.component('todo-item', { template: '<li>这是个待办项</li>' }) </script> <!-- 在实例中引用组件 --> <div id="app"> <!-- 组件使用:上面定义的 todo-item 组件,可以在 vue 模板中使用 --> <todo-item></todo-item> </div> <script> // 得到 Vue 实例 const app = new Vue({ el: '#app' }); </script> </body> </html>
vue中组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是 <todo-item>。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用。
注意:组件的名称不要使用HTML原生的标签名称
组件的一般使用:

组件的使用
全局注册
我们一般把网页中特殊的公共部分注册为全局组件:轮播图、tab选项卡、分页、通用导航
注册:
组件初识的那个Demo ,为了方便演示,让大家先初步的了解组件,所以用的也是全局注册的组件。
// 全局组件的注册 Vue.component('todo-item', { template: '<li>这是个待办项</li>' })
使用:
<!-- 在 vue 控制的模板中引用组件 --> <div id="app"> <todo-item></todo-item> </div>
局部注册(子组件)
局部注册一般是注册一些非通用,只适用于当前项目或者某个模块的组件。
注册:
<script> // 定义一个局部组件内容 var childComponent = { template : '<div>我是局部组件的内容</div>' } // 在 vue 实例中或者在组件中声明这个局部组件,这个局部组件才能被 vue 实例或者其他组件使用。 const app = new Vue({ el: '#app', components : { // <my-local-component> 将只在父组件模板中可用 'my-local-component' : childComponent } }); </script>
使用:
<!-- 在 vue 控制的模板中使用组件 --> <div id="app"> <my-local-component><my-local-component> </div>
组件与组件之间是相互独立的
默认情况下,组件与组件之间无法进行跨组件数据访问,子组件只能被上一层的父组件所调用。
■ 组件就是一种特殊的Vue实例,不需要实例化,它管理自己的template
■ 在组件中,也可以配置自己的类似于Vue实例中的一些选项资源:data、methods、computed
思想:组件自己管理自己,不影响别人。
局部组件之间调用原则:
■ 只能是父组件可以调用子组件,孙组件无法调用。
■ 子孙组件都无法调用父组件。
■ 兄弟节点组件也无法相互调用。
组件的data必须是函数
组件中的data必须是函数(手动new出来的Vue实例还是普通对象)
■ 函数内部返回一个对象
如:
<script> var template = ''; window.AppComponent = { template, //模板内容 data (){ return { message : '组件的数据绑定' } } } </script>
组件使用注意事项:
组件可以理解为特殊的Vue实例,管理自己的template模板
■ 组件的template必须有且只有一个根节点
■ 组件与组件之间是相互独立的,可以有自己的data、methods、computed…
■ 组件的data必须是函数
■ 组件名和组件js尽量使用大写开头的名字,普通js使用小写
父子组件通信:
父亲给孩子: Props Down
1、现在父组件中往子组件标签上添加属性的方式来传递数据
2、然后在子组件中声明props来接收父组件传递的数据。
3、然后在子组件中就可以通过this来访问props中的数据了。
注意:单向数据流
Props是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。
// 传递普通数据类型:父组件修改了,子组件也会受到影响
// 传递引用数据类型:父组件中无论是修改了还是重新赋值都会受到影响。
// 子组件中,无论父组件传下来的是普通数据类型还是引用类型,都不能进行重新赋值。
但是引用类型的数据可以 修改 。
// 如果你想要拿父组件中的数据,又不想影响父组件,那么建议在子组件中定义局部变量存值来进行操作。
孩子通知父亲:Events Up
1、 子组件在内部通过this.$emit(自定义事件名称[,可选传参])发布事件
2、 父组件在使用子组件的标签上通过@自定义事件名称=”事件处理函数”的方式来订阅子组件内部发布的事件
3、 这样的话,当子组件内部this.$emit的时候,则父组件订阅的自定义事件就会执行。
组件之间通讯
浙公网安备 33010602011771号