初探vue3–setup
(作为记录,不正确的地方欢迎指出)
这里使用的是Vite构建的项目
npm init @vitejs/app
后面跟着指示操作就OK了。
vue3中专门为组件提供的新属性.它为我们使用vue3的Composition API 新特新提供了统一的入口.之前定义的data,methods等都统一放入setup中实现。
(Composition API没有深入了解过,我理解为vue中的很多功能拆分成了一个一个的hook,然后将他们组合起来便形成了vue3的composition api)
setup
<template>
<div>
<div>{{ number }}</div>
</div>
</template>
<script>
import { ref } from "vue";
export default {
setup() {
const number = ref(0);
return { number };
},
};
</script>
暴露变量必须 return 出来,这样还是比较繁琐,也可以把setup放入script标签
<template>
<div>
<div>{{ number }}</div>
</div>
</template>
<script setup>
import { ref } from "vue";
let number = ref(0);
</script>
ref 接收参数并将其包裹在一个带有 value property 的对象中返回,然后可以使用该 property 访问或更改响应式变量的值(简单来说操作ref响应式变量的值需要通过.value来)
const numberAdd = () => {
number.value++;
};
如果有复杂数据,我们可以使用reactive,reactive不需要通过.value来操作
let number = ref(0);
const data = reactive({ num1: 1, num2: 2, num3: 3 });
const numberAdd = () => {
number.value++;
data.num1++
console.log(data.num1)
};
这里说一个疑问,为什么const定义一个常量,却还可以更改值呢?
const定义的基本类型不能改变,但是定义的对象是可以通过修改对象属性等方法来改变的。
生命周期和computed
setup中没有了beforeCreate、created,在生命周期钩子前面加上 “on” 来访问组件的生命周期钩子。
beforeCreate 使用 setup()
created 使用 setup()
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeUnmount onBeforeUnmount
unmounted onUnmounted
errorCaptured onErrorCaptured
renderTracked onRenderTracked
renderTriggered onRenderTriggered
activated onActivated
deactivated onDeactivated
let interval;
onMounted(() => {
interval = setInterval(() => {
data.num1++;
}, 1000);
});
onUnmounted(() => {
console.log(1)
clearInterval(interval);
});
其实这样会显得setup很乱,假如我们需要一个处理过后的data我们可以这样写,将逻辑提取出来
<script>
import { ref, reactive, computed, onMounted, onUnmounted } from "vue";
export default {
setup() {
const number = ref(0);
const data = dataArr();
return {
number,
data,
};
},
};
function dataArr() {
const data = reactive({
num1: 1,
num2: computed(() => data.num1 * 2),
num3: 3,
});
let interval;
onMounted(() => {
interval = setInterval(() => {
data.num1++;
}, 1000);
});
onUnmounted(() => {
console.log(1);
clearInterval(interval);
});
return data;
}
</script>
暂时就写这么多,欢迎大家指正