Vue 被忽略的8个基础知识点

2年前 (2022) 程序员胖胖胖虎阿
208 0 0

1、provide(提供)和inject(注入)

这对选项需要一起使用,允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效

第一种用法 :provide直接提供静态对象,inject注入这个对象提供的key,即可使用

let child = {                  //子组件
  inject:['king','three'],     //子组件接收数据
    data(){
      return {
        age:25
    }
  },
  mounted(){
      console.log(this.king,this.three)  //使用父组件提供的数据
  }
}

let vm = new Vue({
    provide(){      //父组件提供数据。  或者  provide:{king:'js',three:25}
        return {    
          king:'js',
          three:25
        }
    },
    data(){
        return {
            name:'js1'
        }
      },
    components:{
        child
    }
})

第二种用法 :provice提供自身组件的data数据源,inject注入这个对象,即可使用

let child = {                  //子组件
  inject:['vmData','abc'],
    data(){
      return {
        age:25
    }
  },
  mounted(){
      console.log(this.vmData.name)   //调用父组件提供的动态name属性
        console.log(this.abc)
  }
}

let vm = new Vue({
  provide(){      
     return {
        vmData:this,
        abc:123
    }
  },
  data(){
    return {
        name:'js1'
    }
  },
  components:{
    child
  }
})

第三种用法 :针对inject用对象接收的情况**

let child = {
    inject:{
        vmd:'vmData',    //  vmData为provide提供的字段名
        abccc:'abc'    //  abc为provide提供的字段名
    },
    data(){
      return {
        age:25
    }
  },
  mounted(){
      console.log(this.vmd.name)   //调用父组件提供的动态name属性
        console.log(this.abccc)
  }
}

let vm = new Vue({
  provide(){      
        return {
        vmData:this,
        abc:123
    }
  },
   data(){
        return {
            name:'js1'
        }
  },
  components:{
      child
  }
)}

2、动态属性和动态事件

<div @[methodname]="onEvent" :[someattr]="'我是内容'">  <!--此处绑定为dbclick事件及title属性-->
  js
 </div>

data: {
    methodname:'dblclick',
    someattr:'title'
}

methods: {
  onEvent() {
    console.log(123);
  }
}

3、style的某个属性绑定多个值

<div :style="sty1">
 js
</div>

data: {
  sty1: {
    background: 'red',
    fontSize: '40px',
    display: ['-webkit-box', '-ms-flexbox', 'flex']  
  }
}

4、template包裹多个元素显示隐藏

<button @click="abc=!abc">abc</button>
<div>123</div>

<template v-if="abc">  *** 可以用template包裹,template不会真正渲染在页面
    <div :style="sty1">js</div>
    <h3>h3</h3>
</template>


data: {
  abc: true,
},

5、未被子组件prop接收的属性'

父组件传的属性给子组件,如果子组件没有用prop接收,这些 属性 会被添加到这个组件的根元素上。
如果你希望组件的根元素继承非prop属性,你可以在组件的选项中设置 inheritAttrs: false。例如:

Vue.component('my-component', {
  inheritAttrs: false,
  // ...
})

也可以指定元素继承非prop属性:通过 $attrs

<com v-model="num" style="background:red" b="2" d="d" abc="666"> </com>

Vue.component('com', {
    inheritAttrs:false,
    props: ['abc'],
    template: `
      <div><h1 v-bind="$attrs"></h1></div>
   `
})

最终渲染为

Vue 被忽略的8个基础知识点

注意 inheritAttrs: false 选项不会影响 style 和 class 的绑定。style和class会照常继承

6、$listeners将组件事件绑定到内部任意标签

如果在组件上直接绑定一个blur事件, 但是子组件根元素不一定是input事件,所以在其他标签上监听blur事件就静默失败,所以要用$listeners把事件转移到其他元素身上

Vue.component('com', {
  inheritAttrs: false,
  props: ['num'],
  computed: {
    inputListeners() {                             //把事件对象存到计算属性
      let vm = this;
      return Object.assign({}, this.$listeners, {  //this.$listeners使用组件时添加的事件对象
        input(event) {                   //此处是为了兼容v-model的默认input事件
          vm.$emit('input', event.target.value)
        }
      })
    }
  },
  template: `
     <div>
       <h1 v-bind="$attrs">我是大标签</h1>
       <input type="text" :value="num" v-on="inputListeners"/>   
                                       <!--用v-on 接收代理全部事件到input身上-->
     </div>
 `
})

<com v-model="num" @blur="onBlur" style="background:red" b="2" d="d" abc="666"> </com>

7、.sync对Prop数据进行双向绑定

通常使用组件时通过子组件触发$emit("update:属性名",新值) 来更新父组件的数据

该功能的快捷方法:.sync修饰符

<div class="wrap">
  {{obj.name}}
  <com v-bind.sync="obj" > </com>   //绑定对象
  
  // 或者<com :title.sync="val" > </com>   //绑定单个属性
</div>
        

data: {
  val: 3,
  obj: {
    name: 'js',
    age: 25
  }
}

子组件
template: `
    <div>
        <h1  
          @click="$emit('update:name','新的name值')">        自动更新obj的name值
           我是内容          
        </h1>
     </div>
  `

8、@hook:声明周期(监听子组件声明周期)


Vue.component('com', {
  data() {
    return {
      obj: {
        name: 'js',
        age: 25
      }
    }
  },
  props: [],
  methods: {
    aaa() {
      this.obj.name = 'js1'
    }
  },
  template: `
    <div>
        <p @click="aaa">aaa事件</p>
    </div>
  `
})


父组件
<com @hook:updated="md"></com>  //监听子组件updated生命周期
methods: {
  md() {
    console.log('子组件数据更新触发'); 
  }
},
版权声明:程序员胖胖胖虎阿 发表于 2022年9月10日 下午10:40。
转载请注明:Vue 被忽略的8个基础知识点 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...