Vue的混合继承详解

Vue的混合继承详解

在Vue中,混合继承(Mixins)是一种非常常用的组件复用方式。它允许我们将多个组件共用的代码提取到一个混合对象中,然后在需要的组件中使用mixins选项进行混合。

一、基本用法

我们将要使用到一个示例,这是一个Vue组件定义的基本结构:

Vue.component('my-component', {
  mixins: [myMixin],
  //组件选项
})

如上所示,我们可以在组件定义时使用mixins熟悉来引用这个混合对象,然后在其组件选项中进行指定。这个数组中每一项都为一个混合对象。

我们接下来定义一个名为myMixin的混合对象:

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

上述代码定义了一个myMixin对象,在其中包含了一个在组件created钩子函数中进行调用的hello方法。这样我们在定义组件时引用了该混合对象后,就可以在每个组件中使用hello方法。

<template>
  <div>Hello World</div>
</template>

<script>
export default {
  created:{
    console.log('hello from component!')
  },
  mixins: [myMixin]
}
</script>

此时当组件的生命周期进入created阶段时,控制台将会输出两行信息:一行输出hello from component!,另一行输出hello from mixin!

二、Mixins的选项合并规则

在使用混合对象时,每一个混合对象中所定义的选项将都会被混入到组件中。当选项冲突的时候则会按照一定的顺序进行合并。

有以下三条规则:

  1. 同名钩子函数将依次被调用,混合对象的钩子将在组件自身钩子之前被调用。

例如,如果我们定义了一个混合对象myMixin包含一个created钩子,在一个组件中同时定义了created钩子,则在实例化组件后,该组件中定义的created钩子函数将首先执行,而混合对象中定义的created钩子函数将第二个执行。

var myMixin = {
  created: function () {
    console.log('hello from mixin!')
  }
}

Vue.component('my-component', {
  created: function () {
    console.log('hello from component!')
  },
  mixins: [myMixin]
})

// 控制台输出:
// 'hello from component!'
// 'hello from mixin!'
  1. 同名选项,如果是methodscomponents则将被混合,组件本身的同名方法将覆盖混合对象的。

例如,我们定义一个混合对象myMixin包含一个methods选项:

var myMixin = {
  methods: {
    greet: function () {
      console.log('greeting from mixin!')
    }
  }
}

而在组件定义中也有一个同名的methods选项:

Vue.component('my-component', {
  methods: {
    greet: function () {
      console.log('greeting from component!')
    }
  },
  mixins: [myMixin]
})

// 现在调用组件的greet方法
this.greet()

// 控制台输出:
// 'greeting from component!'
  1. data选项按照合并策略来确定冲突时的优先级。

这里我们来看一下一个示例,我们定义一个data选项,并在组件定义和混合对象中都进行了定义:

var myMixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}

Vue.component('my-component', {
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  mixins: [myMixin],
  created: function () {
    console.log(this.$data)
    /*
    {
      message: "goodbye",
      foo: "abc",
      bar: "def"
    }
    */
  }
})

这个例子中,我们混合对象和组件选项中都定义了data选项。在实例化组件后,可以发现控制台的输出内容为{ message: 'goodbye', foo: 'abc', bar: 'def' }。此时,混合对象中的同名data选项被忽略掉了,而组件中的data选项被使用。

三、混合对象列表

我们可以将多个混合对象混合成一个组件,如下所示:

var firstMixin = { // 第一个混合对象
  data: function () {
    return {
      message: 'Hello',
      foo: ''
    }
  },
  created: function(){
    console.log('firstMixin')
  },
  methods: {
    say: function() {
      console.log('firstMixin say hello')
    }
  }
}

var secondMixin = { // 第二个混合对象
  data: function () {
    return {
      message: 'world',
      bar: ''
    }
  },
  created: function(){
    console.log('secondMixin')
  },
  methods: {
    say: function() {
      console.log('secondMixin say hello')
    }
  }
}

var vm = new Vue({
  el: '#app',
  mixins: [firstMixin, secondMixin], // 将混合对象列表传递给Vue实例
  created: function(){
    console.log(this.message) // Hello
    console.log(this.foo) // ''
    console.log(this.bar) // ''
  },
  methods: {
    sayHello: function(){
      console.log('Component say hello')
    },
    say: function(){
      console.log('Component say goodbye')
    }
  }
})

控制台输出:

firstMixin
secondMixin
"Hello"
""
""

可以看到,在混合了两个组件后,合并后的组件中拥有两个createdsay方法。此时我们的实例,因混合而来的data选项相应地被合并了起来。

与之类似地,我们的组件选项也会相应地被混合。这样我们就能使用混合对象对组件进行扩展,然后再基于这些新扩展的组件进行开发。

总的来说,在合适的场景下有意识地使用混合对象能提高组件的复用性,让组件更加符合单一职责原则。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue的混合继承详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue组件如何设置Props实例详解

    下面我详细讲解一下“Vue组件如何设置Props实例详解”的完整攻略。 什么是Props 在 Vue.js 中,父组件和子组件之间可以通过 props 传递数据。props 是一个接收组件传递数据的属性,并且只能从父组件传递到子组件。 使用 props 可以让我们对组件进行配置,父组件可以传递数据给子组件,子组件可以使用这些数据作为自己的属性。 如何设置 P…

    Vue 2023年5月27日
    00
  • React中Portals与错误边界处理实现

    当React应用程序遇到问题或出现错误时,错误边界(error boundaries)特别有用。错误边界是React组件,它会在渲染期间捕获并打印任何在树的子组件中抛出的JavaScript错误,并且,相当于错误被“停留”在边界内,防止应用程序崩溃。下面就让我们来详细讲解React中的错误边界处理以及Portals的使用。 错误边界(Error Bounda…

    Vue 2023年5月28日
    00
  • 解决VUE 在IE下出现ReferenceError: Promise未定义的问题

    当我们在使用VUE框架时,若在IE浏览器中出现“ReferenceError: Promise未定义”的问题,主要原因是IE浏览器对Promise的支持不够完善,因此需要进行一些特殊的配置来解决这个问题。 以下是详细攻略: 1. 安装babel-polyfill 在使用VUE框架前,需要先安装babel-polyfill模块。在终端中输入以下命令即可安装: …

    Vue 2023年5月28日
    00
  • 图解Vue 响应式流程及原理

    下面是“图解Vue 响应式流程及原理”的完整攻略。 一、前言 Vue.js是一个开源的JavaScript框架,它采用了MVVM(Model-View-ViewModel)的架构模式,能够帮助我们更加快捷地构建SPA(Single Page Application)应用程序。而响应式就是Vue.js一个非常重要的特性,它是Vue.js实现数据绑定的核心机制,…

    Vue 2023年5月27日
    00
  • Vue中的components组件与props的使用解读

    我将为你详细讲解“Vue中的components组件与props的使用解读”的完整攻略。 什么是Vue中的Components组件? 在Vue中,Components组件是由一些代码块组成的独立实体,它可以被单独使用,也可以被多次重复使用。通过组合构建Vue的组件树,可以实现高效、灵活的开发。 一个Vue组件通常包括三个部分: 模板:用于定义组件的结构,样式…

    Vue 2023年5月27日
    00
  • JavaScript中textRange对象使用方法小结

    JavaScript中textRange对象使用方法小结 什么是textRange对象 textRange对象是指文本范围对象,提供了一种对文本的精确定位和操作的方式。在使用浏览器中的文本框、可编辑的HTML元素时,常常需要使用到textRange对象。textRange对象主要用于选择文本、插入文本、复制/粘贴文本、删除文本等操作。 textRange对象…

    Vue 2023年5月28日
    00
  • vue动态渲染svg、添加点击事件的实现

    为了实现vue动态渲染svg以及添加点击事件,需要采用SVG语言作为矢量图形语言,使用vue指令中的v-html渲染SVG字符串,以及添加@click事件监听器。 实现步骤: 准备SVG字符串。可以是文件、变量定义或远程获取的内容。例如以下的SVG字符串: <svg width="100" height="100&quot…

    Vue 2023年5月28日
    00
  • Vue.js教程之计算属性

    让我来为你详细讲解一下“Vue.js教程之计算属性”的完整攻略。 什么是计算属性? 在 Vue.js 中,计算属性(Computed)是一种在模板中使用的属性,通过计算属性我们可以实现一些动态的内容展示或逻辑处理,并且相较于使用方法或侦听器等方式,计算属性的实现更为简便、高效。 我们可以在 Vue 实例中使用 computed 属性来定义计算属性,该属性是一…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部