1.混入 mixin  一个混入对象可以包含任意组件选项

// mixins.js

 let myMixin= { 
  created: function () { 
        this.hello() 
    },
 methods: {
     hello: function () { 
    console.log('hello from mixin!')
   } 
  }
} 
export default myMixin    

// 组件内:

export default {
  mixins: [myMixin]
}

2. 混入策略:

当组件和混入对象含有同名选项时,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。

同名钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。

值为对象的选项,例如 methodscomponents 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

3. directive 自定义指令

钩子函数:

  bind: 绑定上就执行,只执行一次

  inserted:元素被插入DOM中时调用, 此时可获得DOM节点,对DOM节点进行操作

  update: 所在组件的VNode更新时调用

  componentUpdated: 所在的组件相关虚拟DOM所有都更新时调用

  unbind: 解绑时调用

如果不写钩子函数,默认是bind和update被调用

下面是用自定义指令实现已经有的指令

5. v-on 

<Button v-my-on:click="show2">测试v-on</Button>

Vue.directive("myOn",function(el,binding) {
  el.addEventListener("click",binding.value,false);
});

6.  v-if

Vue.directive("myIf", {
    inserted: function(el,binding) {
    if (!binding.value) {
        el.parentNode.removeChild(el)
     }
    }
});

<div v-my-if="0">这里是实现v-if</div>
<div v-my-if="1">这里是实现v-if</div>

7. v-show

<div v-my-show="isShow">这里是实现v-show</div>
Vue.directive("myShow",function(el,binding) {
    if (!binding.value) {
    el.style.display= "none";
    }else {
    el.style.display= "";  
    }
});    

8. v-model

<input v-bind:value="message" v-on:input="message = $event.target.value" />

通过v-bind将message传给input的value, 用v-on监听输入事件,将输入的值赋给message

9. render 函数

rain.js  // 这里是抽离出来render函数

import About from "views/About";

import Ccc from "views/ccc";

export default {

  render: function(createElement) {

    if (this.level === 1) {

      return createElement(About, {

        props: { level: this.level }

      });

    }

    if (this.level === 2) {

      return createElement(Ccc, {

        props: { level: this.level }

      });

    }

  },

  props: {

    level: {

      type: Number

    }

  }

};

Ccc.vue

<template>

  <div>

    <div>这里是测试render实例的第二个组件</div>

    <div v-if="level">

      这是通过render函数渲染拿到的props level={{ this.level }}

    </div>

  </div>

</template>

<script>

  export default {

      name: 'Ccc',

      props: {

        level: Number

      }

  }

</script>

父组件

Grid.vue  //这里作为父组件里调用render函数

<template>

  <div class="container">

    <div> 这里是render测试</div>

  <Rain :level="1"></Rain>

  <Rain :level="2"></Rain>

  </div>

</template>

<script>

import Rain from './rain'  // 引入render函数的js

export default {

    name: 'Grid',

    components: {

        Rain

    },

    data() {

        return {

            content: '这是一个render实例',

            level: 1

        }

    }

};

</script>
 posted on 2020-12-09 09:36  Yseraaa  阅读(143)  评论(0编辑  收藏  举报