赞
踩
前几篇文章中主要用Options API进行编写代码,但是有一些弊端
setup函数主要有两个参数
props是一个对象,包含着父组件传递过来的属性
context主要包含三个属性
简单实现
<template> <div> <span>{{ count }}</span> <button @click="add">+1</button> <button @click="deAdd">-1</button> </div> </template> <script> //引入ref函数 import { ref } from "vue"; export default { setup() { //定义变量,此时count并不是响应式数据,需要用ref进行包裹 let count = ref(0); //定义函数 //要对count进行修改,需要通过.value的方式进行修改 let add = () => count.value++; let deAdd = () => count.value--; //将变量以及函数返回出去,template中才可以使用 return { count, add, deAdd, }; }, }; </script>
<script> //引入函数 import counter from "./utils/counter"; export default { setup() { let { count, add, deAdd } = counter(); return { count, add, deAdd, }; }, }; </script> -------还可以做以下优化 <script> //引入函数 import counter from "./utils/counter"; export default { setup() { return { ...counter() }; }, }; </script>
setup(){
//可以直接使用,但不是响应式
let message = "hello"
return{
message
}
}
import {reactive} from "vue"
setup(){
//此时就是响应式了
let obj = reactive({
a:100,
b:200
})
//对obj进行修改
obj.a = 300
return{
obj
}
}
<template>
{{count}}
</template>
import {ref} from "vue"
setup(){
//定义简单数据,也可以定义复杂数据
let count = ref(0)
//修改变量
count.value = 100
return {
count
}
}
const obj = reactive({username:"123"})
,不是从数据库中得来的const user = reactive({username:"admin",password:"123456"})
const music = ref([])
onMounted(()=>{
const serverMusic = ["野狼","小苹果"]
music.value = serverMusic
})
创建出来的数据也是响应式数据,但是不能对数据进行修改,但是我们可以对元数据进行修改
setup(){
let obj = ref({
a:100
})
//此时readonlyObj不能进行修改,可以将其传给子组件
let readonlyObj = readonly(obj)
//若我们向修改其内容,可以对obj进行修改
}
isProxy
isReactive
isReadonly
toRaw
shallowReactive
shallowReadonly
<template> <div> <div>{{ user.name }}-{{ user.age }}-{{ user.height }}</div> <button @click=""></button> </div> </template> <script> //引入函数 import { reactive, ref, toRef, toRefs } from "vue"; export default { setup() { let user = reactive({ name: "zhangcheng", age: 18, height: 1.88, }); return { user, }; }, }; </script> <style scoped></style>
const {name,age,height} = user
let user = reactive({
name: "zhangcheng",
age: 18,
height: 1.88,
});
//toRefs对多个值进行ref转化
const { name, age } = toRefs(user);
// toRef对某个属性进行ref转化
const height = toRef(user, "height");
const a = ref(2)
const b = unref(a)//内部实际上是 b = isRef(a)?a.value:a
当某些数据需要进行某些逻辑转化,再显示,就会用到计算属性 computed
import {computed} from "vue"
setup(){
const computedStr = computed(()=>{
return "a+b"
})
return {
computedStr
}
}
import {computed} from "vue"
//可以调用setter方法
const computedObjStr = computed({
set: function (newValue) {
const temp = newValue.split(" ");
str.first = temp[0];
str.last = temp[1];
},
get: function () {
return str.first + str.last;
},
});
//若想修改computedObjStr的话,需要computedObjStr.value="li si"
此ref不是定义数据的ref
在vue中,我们可以通过ref this.$refs.ref进行获取元素,那么在setup函数中怎么使用
<template> <div> <div ref="table">123</div> <div ref="divEl">456</div> </div> </template> <script> //引入函数 import { onMounted, ref, reactive, computed } from "vue"; export default { setup() { const refTable = ref(); const divEl = ref(); onMounted(() => { //需要使用.value获取值 //对于组件使用也是如此 console.log(refTable.value); console.log(divEl.value); }); return { //两种返回方式,一种是对象的增强写法 table: refTable, divEl, }; }, }; </script> <style scoped></style>
在setup中使用生命周期的方式 onX
选项式API | Hook inside setup |
---|---|
beforeCreate | 不需要 |
created | 不需要 |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeUnmount | onBeforeUnmount |
unmounted | onUnmounted |
activated | onActivated |
deactivated | onDeactivated |
import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onActivated, onDeactivated, } from "vue"; setup() { onMounted(() => { console.log("onMounted 执行"); }); return {}; },
import { provide, inject } from "vue";
//父组件
const obj = ref({ a: 100 })
provide("objStr", obj)
//子组件
inject("objStr",{a:0})
在option API中使用的是watch中进行监听数据的变化,那么在composition中怎么进行监听
import { reactive, ref, watch } from "vue"; export default { setup() { /** * 参数 * 1.数据源 * 针对于ref包裹的需要监听.value * 使用数组可以监听多个数据 * 2.执行的逻辑 * 3.配置项:配置deep以及immediate * 默认就是深度监听 */ //定义数据 let obj = ref({ a: 100, b: { c: 200 } }); let objRea = reactive({ username: "zhangcheng" }); //对数据进行监听 watch([objRea, obj.value], (newValue, oldValue) => { console.log(newValue, oldValue); }, { immediate: true, }); return { obj, objRea }; }, }; };
/** * 参数 * 1.数据源 * 针对于ref包裹的需要监听.value * 使用数组可以监听多个数据 * 2.执行的逻辑 * 3.配置项:配置deep以及immediate * 默认就是深度监听 */ let obj = ref({ a: 100, b: { c: 200 } }); let objRea = reactive({ username: "zhangcheng", b: { c: 200 } }); watch( () => ({ ...obj.value, ...objRea }), (newValue, oldValue) => { console.log(newValue, oldValue); }, { deep: true, immediate: true, } );
相较于watch而言,watchEffect可以自动监听依赖变量的变化
const stopWatch = watchEffect(() => {
//当obj.value发生变化的时候,会自动调用这个回调函数
console.log(obj.value);
//执行watchEffect的返回值,就可以停止对数据的监听
if (obj.value > 10) {
stopWatch();
}
});
本质就是setup函数的语法糖
<script setup>
//实际上就是在setup中在编写代码
//不用写return
</script>
<template>
{{ message }}
</template>
<script setup>
//引入函数
import { ref } from "vue";
let message = ref(123);
</script>
<style scoped></style>
<template>
<home-vue></home-vue>
</template>
<script setup>
//导入组件直接使用
import HomeVue from "./components/HomeVue";
</script>
<style scoped></style>
<template> <button @click="messageClick">{{ message }}</button> </template> <script setup> //defineEmits和defineProps都是内部绑定的,因此不用注册 //接受参数 defineProps({ message: { type: String, default: "默认信息", }, }); //定义发射的事件 const messageEmit = defineEmits(["message-click"]); function messageClick() { messageEmit("message-click", "传递参数"); } </script> <style scoped></style>
默认都是在
<script setup></script>标签中写的代码
import { ref } from "vue";
function expsoeFun() {
console.log("暴露出去了");
}
const message = ref("我是变量");
//子组件中有一个函数想被父组件直接调用,需要用到 defineExpose将函数暴露,或者将变量暴露
defineExpose({ expsoeFun, message });
import { onMounted, ref } from "vue";
import HomeVue from "./components/HomeVue.vue";
//绑定实例
const homeVue = ref();
onMounted(() => {
//调用实例中的方法
homeVue.value.exposeFun();
//获取实例中的变量
console.log(homeVue.value.message);
});
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。