vue3如何實現(xiàn)變量雙向綁定
vue3實現(xiàn)變量雙向綁定
vue2可以通過data、props、computed等鉤子綁定變量,vue3也有相似的方式,這里只說一下vue2中的data方式在vue3中的寫法
①通過reactive綁定
<templete>
<div>{{value}}</div>
</templete>
<script lang="ts">
import { toRefs, reactive } from "vue";
export default{
setup(){
const data = reactive({
value:''
})
return {
...toRefs(data) //toRefs可以解構data中屬性,屬性也是雙向綁定的,這樣就不用綁定變量時嵌套data了
}
}
}
</script>②通過ref綁定
<templete>
<div>{{data}}</div>
</templete>
<script lang="ts">
import { onMounted, ref } from "vue";
export default{
setup(){
let data = ref('測試數(shù)據(jù)1')
onMounted({
data.value = '測試數(shù)據(jù)2'
})
return {
data
}
}
}
</script>vue3雙向數(shù)據(jù)綁定、setup 語法糖
組件雙向數(shù)據(jù)綁定
父組件修改值,子組件同步。子組件修改,父組件更新。
<template>
<input type="text" v-module="name" @update:modelValue="onUpdateName($event)">
</template>
<script>
import { ref } from "vue";
export default {
setup() {
const name = ref("");
const onUpdateName = (event) => {
name.value = event;
};
return { name, onUpdateName };
}
}
</script>
向子組件傳遞單個值,通過 props: ["modelValue"] 接收。
子組件改父組件數(shù)據(jù)時,使用 emit("update:modelValue", "新值") 進行修改。
向子組件傳遞多個值,通過 props: ["變量名"] 接收。
子組件改父組件數(shù)據(jù)時,使用 emit("update:變量名", "新值") 進行修改。
customRef
創(chuàng)建一個自定義的 ref 響應式數(shù)據(jù),并對其依賴項跟蹤和更新觸發(fā)進行顯示控制。
實現(xiàn)防抖效果
<template>
<input type="text" v-model="keyword" />
<h1>{{ keyword }}</h1>
</template>
<script>
import { customRef } from "Vue";
export default {
setup() {
// 調用
const keyword = myRef("hello", 500);
return { keyword };
},
};
// 防抖輸入框
function myRef (value, delay) {
let timer = null;
return customRef((track, trigger) => {
return {
// 讀取數(shù)據(jù)
get() {
// 通知vue跟蹤value的變化
track();
return value;
},
// 更新數(shù)據(jù)
set(newValue) {
clearTimeout(timer);
timer = setTimeout(() => {
value = newValue;
// 通知vue去重新解析模板
trigger();
}, delay);
}
};
});
};
</script>
setup 語法糖
<script setup></script> 是一種編譯時語法糖,用于在單文件組件中使用組合式API。
代碼更簡潔,性能更強悍,更好的支持 TS。
<!-- 語法格式 --> <script setup> // 引入第三方,定義變量、方法等 </script>
defineProps
defineProps 用于接收父組件傳遞過來的值,可以直接使用無需導入。實質上就是一個 Props 對象。
<!-- 父組件 --> <template> <!-- 1.給子組件傳參 --> <Test msg="hello world" /> </template> <script setup> import Test from '@/components/Test/Test.vue'; </script>
<!-- 子組件 -->
<template>
<!-- 3.使用傳遞過來的值 -->
{{ msg }}
</template>
<script setup>
// 2.接收傳遞過來的 Props
defineProps({
msg: {
type: String, // 類型
required: true, // 是否必傳
}
});
// 也可以使用變量接收,使用時要寫 props.msg
// const props = defineProps({ msg: String })
</script>
defineEmits
自定義事件。
<!-- 子組件 -->
<template>
<!-- 2.點擊觸發(fā) -->
<button @click="$emit(delete)">點擊事件</button>
</template>
<script setup>
// 1.自定義事件
defineEmits(["delete"])
</script>
<!-- 父組件 -->
<template>
<!-- 3.觸發(fā)父組件方法 -->
<Test @delete="onDeleteHandler" />
</template>
<script setup>
import Test from '@/components/Test/Test.vue';
// 4.方法邏輯
const onDeleteHandler () => {
console.log("deleted");
}
</script>
defineExpose
向組件外暴露數(shù)據(jù)。
<!-- 子組件 -->
<template>
<button @click="$emit(delete)">點擊事件</button>
</template>
<script setup>
import { ref } from "vue";
const count = ref(0);
// 1. 導出暴露數(shù)據(jù)
defineExpose({ count });
</script>
<!-- 父組件 -->
<template>
<!-- 3.ref接收數(shù)據(jù) -->
<Test ref="instance" />
<button @click="log">獲取instance的值</button>
</template>
<script setup>
import Test from '@/components/Test/Test.vue';
import { ref } from "vue";
// 2. 定義變量接收
const instance = ref(null);
const log = () => {
// 4.點擊按鈕獲取暴露的數(shù)據(jù)
console.log(instance.value.count);
}
</script>
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

