vue3之Mixin混入

举报
猫先生c 发表于 2022/11/20 22:28:31 2022/11/20
【摘要】 不同组件使用mixin,mixin里的数据是独立的,组件间不会受影响(A组件使用mixin中的num属性,B组件也是用num属性,A组件修改num的值不会影响B组件引入mixin的num值)

Mixin

分发 Vue 组件中的可复用功能

  • 不同组件使用mixin,mixin里的数据是独立的,组件间不会受影响(A组件使用mixin中的num属性,B组件也是用num属性,A组件修改num的值不会影响B组件引入mixin的num值)
  • 数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。同名钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。
  • app.config.optionMergeStrategies:自定义选项合并策略,会影响混入数据和组件内数据显示的优先级。
    以下设置,则会使混入数据的优先级高于组件内数据的优先级(针对设置的propeety)
app.config.optionMergeStrategies[property] = (toVal, fromVal) => toVal || fromVal

setup写法

mixin.js

import {ref} from 'vue'
export default function(){
  let  num = ref(1);
  let fav = ref(false);
  let favBtn = ()=>{
		num.value += 1;
		fav.value = true;
		setTimeout(()=>{
			fav.value = false;
			  },2000)
		}
		return {num,fav,favBtn}

}

A.vue

<template>
	<div>
		<h1>A组件</h1>
		{{ num }}
		<button @click='favBtn'>
			{{ fav ? '收藏中...' : '收藏' }}
		</button>
	</div>
</template>

<script setup>
import mixin from '../mixins/mixin.js'
let { num , fav , favBtn } = mixin();
</script>

选项式api写法(vue2写法)

mixin.js

export const fav = {
	data () {
		return {
			num:10
		}
	},
	methods:{
		favBtn( params ){
			this.num += params;
		}
	}
}

A.vue

<template>
	<div>
		<h1>A组件</h1>
		{{ num }}
		<button @click='favBtn(1)'>按钮</button>
	</div>
</templat>
<script type="text/javascript">
import { fav } from '../mixins/mixin.js'
export default{
	data () {
		return {
			str:'你好'
		}
	},
	mixins:[fav]
}
</script>
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。