组件:由 template + css + js 三部分组成(.vue文件)css
1)组件具备复用性html
3) 复用组件时,方法不须要隔离,由于方法使用隔离数据就能够产生区别vue
组件介绍:session
<div id="app"> {{ msg }} </div> <script src="vue.js"></script> <script> new Vue({ el: '#app', data: { msg: 'message' }, // template: '<div id="main"><p>{{ msg }}</p><p>{{ msg }}</p></div>' template: ` <div id="main"> <p>{{ msg }}</p> <p>{{ msg }}</p> </div> `, }) </script>
最后显示的效果为app
message message
其实他是先出现messagedom
而后因为后面的template会生成一个临时的dom,会把前面el关联的整个标签变成template中的内容函数
<div id="app"> <!--3)组件渲染--> <local-tag></local-tag> <local-tag></local-tag> <local-tag></local-tag> </div> <script src="js/vue.js"></script> <script> // 1)建立组件 let localTag = { template: '<p>66666</p>' }; new Vue({ el: '#app', // 2)注册组件 components: { // localTag: localTag, 函数名和组件名相同能够直接简写成一个名字 localTag } }) </script>
局部组件能够分三步this
<div id="main"> <global-tag></global-tag> </div> <script src="vue.js"></script> <script> // 全局组件 // 1)建立组件 // 2)渲染组件 // 3) 使用到全局组件的内容必须用Vue进行挂载,若是不挂载全局组件只是个普通的自定义标签 Vue.component('global-tag', { template: '<p>66666</p>' }); new Vue({ el: '#main', }); </script>
使用到全局组件的内容必须用Vue进行挂载,若是不挂载全局组件只是个普通的自定义标签
spa
注意点
code
<div id="app"> <!--3)组件渲染--> <local-tag></local-tag> <local-tag></local-tag> <local-tag></local-tag> </div> <script src="vue.js"></script> <script> // 1)建立组件 let localTag = { data:function(){ return { msg:100 } }, template: '<p>{{msg}}</p>' }; new Vue({ el: '#app', // 2)注册组件 data:{ msg:20 }, components: { // localTag: localTag, 函数名和组件名相同能够直接简写成一个名字 localTag } }) </script>
<div id="main"> <global-tag></global-tag> </div> //<global-tag></global-tag> 这样就是个普通的自定义标签 <script src="vue.js"></script> <script> // 全局组件 // 1)建立组件 // 2)渲染组件 // 3) 使用到全局组件的内容必须用Vue进行挂载,若是不挂载全局组件只是个普通的自定义标签 // 4) 这里的全局不是指整个网页而是指与vue进行挂载那些所有的部分 Vue.component('global-tag', { data:function(){ return { msg:100 } }, template: '<p>{{msg}}</p>' }); new Vue({ el: '#main', data:{ msg:10 } }); </script>
特色和局部相同
<div id="app"> <local-tag :ad_dic="ad" v-for="ad in ads" :key="ad.img"></local-tag> </div> <script src="js/vue.js"></script> <script> let localTag = { props: ['ad_dic'], template: ` <div class="ad"> <img :src="ad_dic.img" alt=""> <h4>{{ ad_dic.title }}</h4> </div> `, }; // 模拟后台的数据 let ads = [ { 'img': 'img/001.png', 'title': '小猫' }, { 'img': 'img/002.png', 'title': '黄蛋' }, { 'img': 'img/003.png', 'title': '蓝蛋' }, { 'img': 'img/004.png', 'title': '短腿' }, ]; new Vue({ el: '#app', data: { ads, // 后期项目是后台返回的数据 }, components: { localTag } }) // 分析数据 父传子 // 1)父组件提供数据 // 2)在父组件模板中,为子组件标签设置自定义属性绑定父级数据 // 3)在子组件props成员中,接收自定义属性 // 4)在子组件模板和方法中,使用自定义属性名就能够访问父级数据 </script>
简单总结
父级模板
:<local-tag :属性名
="父级的数据
" v-for="ad in ads" :key="ad.img"></local-tag>
子级模板
: props: ['属性名'],
<div id="app"> <p> <input type="text" v-model="info"> <button @click="add_msg">留言</button> <ul> <msg-tag @del_action="del_li" :msg="msg" :index="i" v-for="(msg, i) in msgs" :key="msg"></msg-tag> </ul> </p> </div> <script src="js/vue.js"></script> <script> let msgTag = { props: ['msg', 'index'], template: ` <li> <span @click="del_fn" class="del">x</span> <span>{{ msg }}</span> </li> `, methods: { del_fn() { this.$emit('del_action', this.index) } } }; new Vue({ el: '#app', components: { msgTag }, data: { info: '', msgs: JSON.parse(sessionStorage.msgs || '[]'), }, methods: { add_msg() { let info = this.info; if (info) { this.msgs.unshift(this.info); this.info = ''; sessionStorage.msgs = JSON.stringify(this.msgs); } }, del_li(index) { console.log(index); this.msgs.splice(index, 1); sessionStorage.msgs = JSON.stringify(this.msgs); } } }); // 分析数据 子传父 // 1)子组件提供数据 // 2)子组件经过系统事件激活本身的绑定方法,发送一个自定义事件,携带自身数据 // 3)在父组件模板中的子组件标签中为自定义事件绑定父组件方法 // 4)父组件实现方法获取到子组件数据 </script>
简单总结
子级模板
: <span @系统自带的属性
="子级方法" class="del">x</span>
子级实例方法中
:this.$emit
('自定义事件
',子级数据们)
父级模板
:<msg-tag @自定义事件
="父级的方法
" v-for="(msg, i) in msgs" :key="msg"></msg-tag>
父级方法
: 父级的方法
(子级的数据们
){处理与子级相关的函数
}