平时习惯了用自己所知的方法来解决问题。今天看到自己之前写的组件被同事改了一下,看到一些没怎么用过的方法。特意去恶补了一下,算给自己打个补丁并记录一下。

provide/inject

provide,inject这个东西,说实话我个人觉得至此为止,我遇到的工作中他能用的场景其实不多。这个东西就是props的加强版。
一搬父子传参我们可以用:

1.props

父子组件间通过属性的写法,直接传参。

// 父组件<children :parmas="data"></children>
// 子组件用props接props:{    data: Object}// 使用时直接在本vue实例用调this.data

2.vuex

状态管理就是一个全局的库,在根部注册后,在任意实例中都可以通过store调用变量。

this.$store.state

3.provide/inject

这个就是介于前两者之间的东西。他是通过在某一父组件中注册一个变量。在其子孙组件中可以调用其变量。不局限在直接父子间。
用法:

// 父组件中  export default {    name: "Parent",    provide: {      for: "demo"    }  }
// 子孙组件  export default {    name: "grandson",    inject: ['for']  }// 调用也是跟props一样this.for

provide/inject就是一个局部的小库。在一些整体没有必要引Vuex,在某个模块中又需要用到一个库的项目中它是可以考虑的选择。

directive(自定义指令)

需要批量操作特定dom的时候,特别是需要用到dom节点的时候。可以考虑用自定义指令完成。 这个官网解释得很详细。自定义指令

1.注册

// 注意是在根部Vue调用directive注册,这里写指令的时候不需要加"v-"Vue.directive('focus', {  inserted: function (el) {    el.focus()  }})

2.使用

// 直接加"v-"即可,dom被直接聚焦<input v-focus>

3.生命周期(钩子)

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

4.参数解析

  • el:指令所绑定的元素,可以用来直接操作 DOM 。
  • binding:一个对象,包含以下属性:

    1. name:指令名,不包括 v- 前缀。
    2. value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
    3. oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    4. expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    5. arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
    6. modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。