注册语法(全局注册):全局组件注册后,任何vue实例都可以用
Vue.component('组件名称', { data: 组件数据, template: 组件模板内容 })定义一个名为button-counter例子:
<script type="text/javascript"> Vue.component('button-counter',{ //第一个参数是组件名称 vue.component是api data:function(){ //第二个参数是一个对象 第一个属性一个属性是data:值必须是一个函数,同时这个函数要求返回一个对 象,函数里提供具体的对象,放需要的数据 如果不需要数据 可以省略data这个属性 return { count:0 } }, template:'<button @click="handle">点击{{count}}次</button>', //第二个属性是模板内容 内容是‘字符串 vue支持的模板语法’ 绑定的事件要双引号,因为外面是单引号 methods: { handle:function(){ this.count += 2; //count++ } } }) var vm = new Vue({ //vue实例也是一个组件 顶层组件 el:'#app', data: { } }) </script>组件用法:
<div id="app"> <!-- 用组件的名称放到容器里来使用组件 因为在app里面所以也是子组件--> <button-counter></button-counter> </div>注册注意事项:
data必须是函数 VUE实例data是对象 本质也是组件. 组件都是一个独立的实例, 函数会形成闭包 每个组件拥有独立的数据组件模板内容必须是单个根元素 必要情况下可以最外面加div盒子组件模板内容可以是模板字符串复杂的情况下 用字符串 反引号··(需要浏览器的支持,因为是es6语法)如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是 在普通的标签模板中,必须使用短横线的方式使用组件,因为不识别大小写.局部注册:只能在当前注册它的vue实例(父组件)中使用
var Child = { template: '<div>hello</div>' } var vm = new Vue({ el:"" components: { 'my-component':Child //components注册局部组件 } })子组件通过自定义事件向父组件传递信息
Vue.component('menu-item', { props: ['parr'], template: ` <div> <button @click='$emit("enlarge-text", 5)'> </button> </div> ` }); // 子传父,一定要定义一个@click=“函数1” 子传父一定是一个自定义事件 子组件触发一个事件 父组件去监听这个事件 子组件触发了 父组件就接收到了 //函数体内,代码片段要写$emit('自己取的事件名',子组件内的参数) 事件名是要被父组件监听的 //在父组件模板里 @事件名=“函数2($event)” $event接收的是子组件内的参数父组件监听子组件的事件
<menu-item :parr='parr' @enlarge-text='handle($event)'></menu-item>ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例 注意:只要想要在Vue中直接操作DOM元素,就必须用ref属性进行注册
子传父简单办法: 在子组件标签上添加ref='name'属性,父组件实例中添加$refs属性就可以访问到data数据了
<div id="app"> <my-com ref="com1"></my-com> </div> <template id="tem"> <div> <h1>我是组件1</h1> </div> </template> <script> Vue.component('myCom',{ template:"#tem", data(){ return { name:'你抓到我了么???' } } }) const vm = new Vue({ el:'#app', mounted() { console.log(this.$refs.com1.name); } }) </script>父传子简单方法: $parent:子组件可以直接获取到该子组件的父组件的实例对象
<div id="app"> <my-com></my-com> </div> <template id="tem"> <div> <h1>我要在子组件中显示一下父组件的msg : {{ $parent.msg }}</h1> </div> </template> <script> Vue.component('myCom',{ template:"#tem", mounted(){ // $parent 可以让子组件 直接获取到 改子组件的父组件实例对象 console.log(this.$parent.msg) //直接拿到父组件的msg属性了 } }) const vm = new Vue({ el:'#app', data:{ msg:'我是父组件' } }) </script>