vue笔记(三) vue的组件
为什么用vue组件:
- 拆分业务逻辑,降低业务复杂度
- 组件复用
vue组件与vue实例区别:
- 没有配置对象的el元素:因为组件可以复用,与vue实例相比,没有固定的挂载位置,
- data是一个函数:防止复用的组件们之间变量相互污染
组件注册
全局注册:Vue.component('组件名', 组件)
局部注册:在vue实例中的component属性中注册
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.5.3/vue.min.js"></script> </head> <body> <!-- <btn></btn> --> <div id="app"> <btn /> </div> <script> const btn = { data: function () { return { time: 0, } }, template: ` <button>点击了{{time}}次</button>` } // Vue.component('btn', btn)//全局注册 new Vue({ el: '#app', components: {//在vue实例上注册 btn: btn } }) </script> </body> </html>
组件传值
组件的复用就像函数类似,谁都可以调用他,组件传值就像函数的传参,调用者决定组件显示什么;这符合vue的哲学思想:谁的数据谁控制;
props:子组件中声明组件属性,调用者通过模板引用子组件时,通过自定义prop属性来传值。
单向数据流
从父组件传过来的值,然后传给子组件,可以一级一级传下去,形成完整的单向数据流;
这种父级组件传来的数据在子组件是不允许被修改的,像上图中的title,不能被修改。因为这不是子组件的数据,是父组件传来的数据,目的是按照父组件的数据展示,一旦修改会引发很多问题。
比如:页码组件接受父组件传来的props有currentPage(当前页)属性,同时父组件也有展示数据组件来显示当前页的信息。如果子组件页面组件要修改currentPage,则父组件传过来的currentPage会变化,此时父组件不知道currentPage变化了,导致了展示数据组件没有及时更新数据,即出现页码和页面的展示数据不一致。
所以,子组件修改props必须通知父组件,让父组件去处理这个通知,父组件根据通知,决定将currentPage++,同时对应的展示数据子组件也会根据currentPage的变化而展示不同数据。
//即:父组件给子组件props,而子组件给父组件event。props是属性的意思,传递给子组件属性,event是事件的意思,是触发父组件中绑定在当前实例上的事件,表示告诉父组件,有大事发生了。
关于事件:无论是最初学习的页面绑定时间,还是vue;如document.getElementById('demo').onclick = function(event){ 这是点击事件的处理 };还是vue定义的@click,都是事件。在父组件引用子组件时候,自定义的事件如<son @pageChange='dealPageChange'>,在son这个子组件中,自定义的事件pageChange,表示传递给了子组件一个信息,你在需要向父组件传值时候,可以触发这个。就像通过绑定<son @pageChange='dealPageChange' :count='currentpage'>可以看出count和pagechange都是绑定在子组件身上,给子组件中用的
绑定事件时候,参数要善于利用props或者data的属性;
注册事件和触发事件是与原生js相同的过程,只是原生js的点击,用鼠标,js底层已经定义了触发事件,我们不需要管,
注册点击事件--->鼠标点击绑定的dom----->js底层自动运行触发事件的函数,获取回调方法,做出相应处理。
我们自己注册的事件,在某个条件下,需要手动触发,用$emit('父组件在子组件上注册的事件名称',[参数]);