Vue 组件化、父子通信[props, $emit(), $children, $refs, $parent]
组件化:
任何应用都会被抽象成一种树结构
主见使用三步骤
1.创建组件构造器 调用Vue.extend()创建组件构造器
2.注册组件 调用Vue.component('a','b')方法注册组件 :一个参数a-注册组件的标签名;另一个参数b-组件构造器名称
3.使用组件 在Vue实例的作用范围内使用组件
<div id="app"> <cpn></cpn> </div> <script> const cpnC = Vue.extend({ template:`<div> <p>这是一个标题</p> </div> ` }) const app = new Vue({ el: '#app', components: { cpn: cpnC } }) }) </script>
组件的语法糖
Vue.component('cpn', { template:`<div> <p class="left">看看我的 margin是多少</p> <p class="right">看看我的 margin是多少</p> <a href="">999</a><a href="">66666</a></div> ` }) //模板分离写法 html 代码可以放在 <template> 标签内 或者 <script type="text/x-template"> 标签内
组件数据存放
Vue.component('cpn', { template:'', data(){ return {} }} 组件中data必须是个函数
父子组件的通信
父向子传递
props:{ //类型限制 cmovies:Array,//限制数组类型 cmovie:[String,Number],//限制多个类型 cmessage:{ type:String,//限制字符串类型的值 default:‘aaa’//默认值一般类型 //defailt:function(){//默认值为数组或者对象必须工厂函数获取 //return {} //} required:true//必传值,必填字符串 validator:function(){ return ['success', 'warning'].indexOf(value) !== --1 //自定义验证函数 } } }
注意:props在父级传递不能使用驼峰命名。此处vue版本v2.6.12
1 <div id='app'> 2 <cpn :c-info='info'></cpn> //这里要是注意写法,不能使用cInfo 3 </div> 4 5 <template id="cpn"> 6 <div> 7 <h3>{{ cInfo }}</h3> 8 </div> 9 </template> 10<script src="js/vue.js"></script>
11 Vue.component("cpn", {
12 template: '#cpn', 13 props:{ 14 cInfo: { 15 type:Object, 16 default(){ 17 return {} 18 } 19 } 20 } 21 }) 22 const app = new Vue({ 23 el:"#app", 24 data: { 25 info: { 26 name:'Hao', 27 age: 26, 28 height: 1.80 29 } 30 } 31 })
子组件向父组件传递数据:自定义事件
流程;
在子组件中,通过$emit()来触发事件。
在父组件中,通过v-on来监听子组件的事件。
<div id="app"> <cpn @counter-click="cpnClick"></cpn> </div> <template id="cpn"> <div> <button @click="add">++</button> </div> </template> // 子组件 Vue.component("cpn", { template: '#cpn', data() { }, props:{ }, methods: { add() { //发射事件:自定义事件。后面可以添加变量 this.$emit('counter-click') } } }) //父组件 const app = new Vue({ el:"#app", methods: { cpnClick() { console.log(99) } } })
tips:
v-model 等于 :value + @input
父访问子组件:$children 或者 $refs(推荐使用)
this.$chilidren 返回所有子组件。不方便修改。获取全部子组件时使用
$refs:
组件中添加ref <cpn ref="aaa"></cpn> 方法中即可调用:this.$refs.aaa
子访问父组件:this.$parent
访问根组件:this.$root