首先,js 抽离可以有效解决逻辑代码重复的问题。 在 Vue 2 中,可以利用 mixin 抽象组件逻辑( 非常好用 )。但是,他们有几个问题:
1. Mixin 很容易发生冲突 : 因为每个 mixin 的 property 都被合并到同一个组件中,所以为了避免 property 名冲突,你仍然需要了解其他每个特性。
2. 可重用性是有限的 : 我们不能向 mixin 传递任何参数来改变它的逻辑,这降低了它们在抽象逻辑方面的灵活性。
为了解决这些问题,我们添加了一种通过逻辑关注点组织代码的新方法:利用组合式 API语法抽离。
import {ref, inject} from "vue";
// 利用一个函数返回公共属性及函数
export default function sayJS(){
// whatContent 可以看做为一个属性
let whatContent = inject('whatContent', '默认说话内容');
// sayLog 可以看做为一个组件的内置函数
const sayLog = ()=>{
console.log('我是一个函数...');
}
// 利用 return 返回属性及行数
return {
whatContent, sayLog
};
}
<template>
<div>说话内容 : {{whatContent}} ...</div>
</template>
<script setup>
import { onMounted } from 'vue'
import sayJS from './Say.js';
// 此处从 Say.js 获取公共的属性和函数
const {whatContent, sayLog} = sayJS();
// 此处演示 动态改变 whatContent 值
onMounted(()=>{
sayLog();
setTimeout(()=>{
whatContent.value = 'holl'
},2000);
});
// 暴露组件方法及属性
defineExpose({
whatContent,
sayLog
})
</script>
<template>
<say ref="sayCom"></say>
</template>
<script setup>
import { provide, ref, onMounted } from 'vue';
let whatContent = ref('您好');
provide('whatContent',whatContent);
// 组件引用演示
const sayCom = ref(null);
onMounted(()=>{
console.log(sayCom.value.whatContent+'...');
sayCom.value.sayLog();
});
</script>