Vue 冷门知识 - -自定义插件 自定义指令 inheritAttrs,attrs 和 .sync 以及 this.$options 和箭头函数中的this

实现子组件与父组件双向绑定的.sync修饰符

首先 缕清思路
子组件想要修改父组件的值 父组件需要先传递数据给子组件,子组件接收后$emit触发父组件中的函数 才能修改父组件中的值
下面是简写代码块实例

//父组件
<div>
  <son :title="title" @changeTitle='dotitle'></son> 
//<son  :title.sync=title></son>  .sync其实是上面一句代码的语法糖(简写形式) 此时不用定义函数了
</div>
data(){
return{ 
   title: 标题111
}
},
methods: {
dotitle(titleValue){
   this.title=titleValue
}
}
//子组件
<div>{{title}}</div>
<button @click='change'></button>
props: {
  title: String
},
methods: {
change(){
this.$emit('changeTitle','标题222')
//this.$emit('update:title','标题222') uptade: [prop -name] 是固定写法
}
}

作用 : 对传递给子组件的 prop 数据进行“双向绑定”。(正常情况下,prop 的数据都是单向数据流)
其次,当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定。如果我们不用.sync,我们也可以props传初始值,然后事件监听,实现起来也不算复杂。

inheritAttrs和attrs

应用 场景: 父组件需要传递数据给子组件 子组件还要将这个数据传递给它的子组件

//父组件
<div>
    <child :text="text"></child>
</div>

//子组件
<div>
    <my-child :text="text"></my-child>
</div>

//子组件的子组件
<div>
    <div>{{text}}</div>
</div>

可以使用vuex来解决 但是不复杂的项目引用vuex实际没必要

//父组件
<template>
   <div>
     <child :text="text"  :count="count"></child>
   </div>
</template>

<script>
    export default{
        data(){
            return {
                text:"父组件的值",
                count:123456}
        }
    }
</script>
//子组件
<template>
    <div>{{text}}</div>  //但是能够看到count
</template>
<script>
    export default{
        props:["text"]
    }
</script>

可以通过设置inheritAttrs: false来取消这种默认行为

data(){
  return{
    ......   
  }  
}

inheritAttrs: false,  //取消这种默认行为
mounted(){
  console.log(this.$attrs); //{count:123456}
}
<template>
    <div class="child">
        <my-child v-bind="$attrs"></my-child>
    </div>
</template>

子组件的子组件也可以获取这个值了

自定义指令

对普通 DOM 元素进行操作

// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
//局部
directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}
<input v-focus>  //input输入框自动选中

自定义插件

1.插件通常会为 Vue 添加全局功能,一般是添加全局方法/全局指令/过滤器等,对于插件只要在最开始引入一次,在任何组件就可以直接使用

2.Vue 插件有一个公开方法 install ,通过 install 方法给 Vue 添加全局功能

3.通过全局方法 Vue.use() 使用插件,它需要在你调用 new Vue() 启动应用之前完成.

这个插件对象有一个公开属性 install ,他的值为一个函数,此函数接受两个参数。第一个参数是 Vue 构造器 , 第二个参数是一个可选的选项对象。
最会导出此插件对象以供别人使用,如下所示

//所谓vue的插件,就是一个js对象
let myplugin={
    install:function(Vue,Options){
        //在这里写插件需要实现的功能
    }
}
export default myplugin;

element-ul是一个插件库 安装完成后 一键use就有了各种组件

(function () {

  const MyPlugin = {} //声明一个插件对象

  MyPlugin.install = function (Vue, options) {
    // 1. 添加全局方法或属性
    Vue.myGlobalMethod = function () {
      alert("添加全局方法或属性")
    }

    // 2. 添加全局资源
    Vue.directive('my-directive', {
      inserted: function (el, binding) {
        el.innerHTML = binding.value
      }
    })

    // 3. 注入组件选项
    Vue.mixin({
      created: function () {
        // 逻辑...
      }
    })  
     //这个混入是全局的
 //全局注册。使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的    Vue 实例
 //当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项
    // 4. 添加实例方法,可以传参
    Vue.prototype.$myMethod = function () {
      alert('添加实例方法')
    }

  }
  // 将插件添加到 window 对象中
  window.MyPlugin = MyPlugin

})()

混入

var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}
//这个混入是局部的 不会影响别的组件
混入差不多就是混合的意思 使用 mixins: [混入名],就将两者混合在一起,在发生冲突时以组件数据优先 比如此例中以组件本身的data为主
new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

this.$options

获取本页面和name ,data 同级的自定义属性

箭头函数的this指向问题

箭头函数没有自己的this,它的this是继承而来,默认指向在定义它时所处的对象(宿主对象)。

这是一个非箭头函数
在这里插入图片描述

这里的this指向的是window对象,这是由于setIntervalsetTimeout调用的代码运行在与所在函数完全分离的执行环境上。这会导致这些代码中包含的 this 关键字会指向 window (或全局)对象。

做一个修改

在这里插入图片描述
在这里插入图片描述
将this存为一个变量,此时的this指向Person1,也可以使用bind函数来绑定this实现以下效果

参考链接
修改setInterval和setTimeout中的this指向全局的问题

1.使用箭头函数 函数里面的设置延迟中的this就指向这个函数了 而不是window
2.在函数里面定义var that =this 在延迟函数里面直接使用that
3.使用bind()当被绑定函数执行时,bind方法会创建一个新函数,并将第一个参数作为新函数运行时的this。在这个例子中,在调用setTimeout中的函数时,bind方法创建了一个新的函数,并将this传进新的函数

如有错误 欢迎指正! 感谢

发布了33 篇原创文章 · 获赞 0 · 访问量 862

猜你喜欢

转载自blog.csdn.net/weixin_44685781/article/details/105298669