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 Router导航钩子与Vuex来实现后退状态保存

    本文将详细讲解如何使用Vue Router导航钩子与Vuex来实现后退状态保存的解决方案。 什么是导航钩子? 导航钩子是Vue Router提供的一种功能,用于在路由导航过程中拦截操作,触发特定的函数。导航钩子包含全局导航钩子和路由级别导航钩子。 对于全局导航钩子,可以用于全局拦截路由导航,比如用户未登录时跳转到登录页面。而对于路由级别导航钩子,可以用于针对…

    Vue 2023年5月28日
    00
  • js基于div丝滑实现贝塞尔曲线

    下面就是详细讲解“js基于div丝滑实现贝塞尔曲线”的完整攻略。 1. 什么是贝塞尔曲线? 贝塞尔曲线是一种使用平滑曲线连接任意多个点的数学函数,并且通过更改这些点的锚点信息来改变曲线的特性。在前端网站开发中,贝塞尔曲线经常被用来创建各种交互效果,如动画、滑动、转场等。 2. 为什么要基于div实现贝塞尔曲线? 虽然在SVG和canvas中也可以实现贝塞尔曲…

    Vue 2023年5月28日
    00
  • Vue集成阿里云做滑块验证的实践

    下面是“Vue集成阿里云做滑块验证的实践”的完整攻略。 1. 背景介绍 滑块验证已成为网站安全必备功能之一,它可以有效防止恶意注册、恶意评论、恶意刷票等行为。阿里云的滑块验证是一种比较常用的实现方式,本文将分享如何使用Vue框架集成阿里云滑块验证的方法。 2. 集成阿里云滑块验证 2.1 引入阿里云滑块验证JS SDK 首先,需要在index.html文件中…

    Vue 2023年5月28日
    00
  • Vue 2中ref属性的使用方法及注意事项

    Vue 2中的ref属性是一个非常有用的功能,可以用来在Veu实例中访问组件、元素或子组件。以下是关于Vue 2中ref属性的使用方法及注意事项的攻略。 什么是ref属性 ref是Vue提供的一个属性,可以用来在Vue实例中设置、组件或元素的标识,通过这个标识可以直接在Vue实例中访问相应的实例或元素。 ref属性的使用方法 在Vue模板中使用ref属性需要…

    Vue 2023年5月28日
    00
  • vue项目实现图片上传功能

    下面是实现Vue项目图片上传功能的完整攻略: 准备工作 在开始实现图片上传功能之前,我们需要先进行几项准备工作。首先,需要确定你使用的Vue版本是否支持vue-cli3,如果不支持,需要先安装一个支持vue-cli3的Vue版本。其次,需要安装一个Vue插件——vue-uploader,以便我们更方便地完成图片上传功能开发。 安装Vue-cli3 Vue-c…

    Vue 2023年5月28日
    00
  • vue1.0和vue2.0的watch监听事件写法详解

    下面就来详细讲解Vue.js的watch监听事件写法。 什么是Vue.js的watch监听事件 在Vue.js中,watch监听是Vue实例中一个非常重要的属性。它可用于监控Vue实例数据的变化,并在数据变化时立即做出响应操作。 Vue.js的watch监听事件用于监控数据变化的情况下执行一些操作。比如:当数据变化时,需要向服务器发送请求,或根据数据变化对D…

    Vue 2023年5月29日
    00
  • vue全局过滤器概念及注意事项和基本使用方法

    vue全局过滤器概念及注意事项和基本使用方法 在Vue中,全局过滤器是一个简单的函数,用于将文本转换为更易读的格式。全局过滤器可以用于处理日期格式、价格格式、将字符串转换为小写等多种情况。全局过滤器可以在任何Vue组件的模板中使用。 注意事项 在使用全局过滤器时,需要注意以下几点: 全局过滤器一旦定义,就可以在整个应用程序中使用。因此,需要在定义全局过滤器时…

    Vue 2023年5月27日
    00
  • 对vue里函数的调用顺序介绍

    接下来我会详细讲解“对vue里函数的调用顺序介绍”的完整攻略。 1. Vue函数的调用顺序 Vue中的函数调用顺序有如下几种情况: beforeCreate(创建前): 这个阶段会在Vue实例初始化之后,数据观测之前被调用。在此阶段,我们无法访问到 data、computed、methods、watch中的任何属性。 created(创建后): 该阶段在实例…

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