Mixin問題如何解決?
来源:2-14 vue组件如何抽离公共逻辑
齊帥
2021-03-29 14:00:24
老師請問那現在Composition API是如何解決這個問題的?
1回答
同学你好,这个问题稍微有点儿复杂,接下来的解答内容会有点儿长,请同学耐心看完哟
1、首先来了解一下composition api
composition api的主要思想是将它们定义为从新的setup函数返回的JS变量,而不是将组件的功能(例如state、method、computed等)定义为对象属性。
2、vue2.x版本实现代码与composition api代码对比
①来一个经典的vue2的计数器案例:
//Counter.vue export default { data: () => ({ count: 0 }), methods: { increment() { this.count++; } }, computed: { double() { return this.count * 2; } } }
②使用Composition API定义一个完全相同的组件
// Counter.vue import { ref, computed } from "vue"; export default { setup() { const count = ref(0); const double = computed(() => count * 2) function increment() { count.value++; } return { count, double, increment } } }
③ref:导入了ref函数,表示该函数允许我们定义一个响应式变量,其作用与data变量几乎相同。
④count.value:increment方法是一个普通的js函数,需要更改子属性count的value才能更改响应式变量,这是因为使用ref创建的响应式变量必须是对象,以便在传递的时候保持一致。
3、代码提取
Composition API的第一个优点是提取逻辑很容易。使用Composition提取上面Counter.vue组件代码。
//useCounter.js import { ref, computed } from "vue"; export default function () { const count = ref(0); const double = computed(() => count * 2) function increment() { count.value++; } return { count, double, increment } }
4、代码重用
要在组件中使用该函数,只需将模块导入组件文件并调用它(注意导入是一个函数)。这将返回定义的变量,然后可以从setup函数中返回它们。
// MyComponent.js import useCounter from "./useCounter.js"; export default { setup() { const { count, double, increment } = useCounter(); return { count, double, increment } } }
5、解决mixins命名冲突
在vue2中,可能会有相同命名的变量或者函数,会导致冲突,使用composition api代替后,就可以解决了:
export default { setup () { const { someVar1, someMethod1 } = useCompFunction1(); const { someVar2, someMethod2 } = useCompFunction2(); return { someVar1, someMethod1, someVar2, someMethod2 } } }
简单的说,Composition api允许vue依靠原生JS中内置的保障措施来共享代码,比如将变量传递给函数和模块系统。另外,这部分内容比较繁琐,这里建议同学先做了解,后续老师会进行讲解哟!
希望可以帮到你,祝学习愉快!
相似问题