• 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

  • 相关阅读:
    对象o o[name]和o['name']的差别
    数组转换为字符串
    函数和方法区别
    创建对象和构造函数的区别
    jQuery光源移动效果
    继承原型链
    javascript跨域
    prototype、constructor、__proto__
    寄生组合式继承
    组合继承
  • 原文地址:https://www.cnblogs.com/jidanbufan/p/13950421.html
Copyright © 2020-2023  润新知