vue3如何實(shí)現(xiàn)變量雙向綁定
vue3實(shí)現(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可以解構(gòu)data中屬性,屬性也是雙向綁定的,這樣就不用綁定變量時(shí)嵌套data了
}
}
}
</script>②通過ref綁定
<templete>
<div>{{data}}</div>
</templete>
<script lang="ts">
import { onMounted, ref } from "vue";
export default{
setup(){
let data = ref('測(cè)試數(shù)據(jù)1')
onMounted({
data.value = '測(cè)試數(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>
向子組件傳遞單個(gè)值,通過 props: ["modelValue"] 接收。
子組件改父組件數(shù)據(jù)時(shí),使用 emit("update:modelValue", "新值") 進(jìn)行修改。
向子組件傳遞多個(gè)值,通過 props: ["變量名"] 接收。
子組件改父組件數(shù)據(jù)時(shí),使用 emit("update:變量名", "新值") 進(jìn)行修改。
customRef
創(chuàng)建一個(gè)自定義的 ref 響應(yīng)式數(shù)據(jù),并對(duì)其依賴項(xiàng)跟蹤和更新觸發(fā)進(jìn)行顯示控制。
實(shí)現(xiàn)防抖效果
<template>
<input type="text" v-model="keyword" />
<h1>{{ keyword }}</h1>
</template>
<script>
import { customRef } from "Vue";
export default {
setup() {
// 調(diào)用
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> 是一種編譯時(shí)語法糖,用于在單文件組件中使用組合式API。
代碼更簡(jiǎn)潔,性能更強(qiáng)悍,更好的支持 TS。
<!-- 語法格式 --> <script setup> // 引入第三方,定義變量、方法等 </script>
defineProps
defineProps 用于接收父組件傳遞過來的值,可以直接使用無需導(dǎo)入。實(shí)質(zhì)上就是一個(gè) Props 對(duì)象。
<!-- 父組件 --> <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, // 是否必傳
}
});
// 也可以使用變量接收,使用時(shí)要寫 props.msg
// const props = defineProps({ msg: String })
</script>
defineEmits
自定義事件。
<!-- 子組件 -->
<template>
<!-- 2.點(diǎn)擊觸發(fā) -->
<button @click="$emit(delete)">點(diǎn)擊事件</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)">點(diǎn)擊事件</button>
</template>
<script setup>
import { ref } from "vue";
const count = ref(0);
// 1. 導(dǎo)出暴露數(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.點(diǎn)擊按鈕獲取暴露的數(shù)據(jù)
console.log(instance.value.count);
}
</script>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue配置文件自動(dòng)生成路由和菜單實(shí)例代碼
因?yàn)椴煌挠脩粲胁煌臋?quán)限,能訪問的頁面是不一樣的,所以我們?cè)趯懞笈_(tái)管理系統(tǒng)時(shí)就會(huì)遇過這樣的需求:根據(jù)后臺(tái)數(shù)據(jù)動(dòng)態(tài)添加路由和菜單,這篇文章主要給大家介紹了關(guān)于vue配置文件自動(dòng)生成路由和菜單的相關(guān)資料,需要的朋友可以參考下2021-08-08
vue-router vuex-oidc動(dòng)態(tài)路由實(shí)例及功能詳解
這篇文章主要為大家介紹了vue-router vuex-oidc動(dòng)態(tài)路由實(shí)例及功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
前端vue3手動(dòng)設(shè)置滾動(dòng)條位置/自動(dòng)定位詳細(xì)代碼
這篇文章主要給大家介紹了關(guān)于前端vue3手動(dòng)設(shè)置滾動(dòng)條位置/自動(dòng)定位的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)學(xué)習(xí)或者使用vue3具有一定的參考解決價(jià)值,需要的朋友可以參考下2024-05-05
Vue數(shù)組中出現(xiàn)__ob__:Observer無法取值問題的解決方法
__ob__: Observer這個(gè)屬性其實(shí)是Vue監(jiān)控變量產(chǎn)生的,下面這篇文章主要給大家介紹了關(guān)于Vue數(shù)組中出現(xiàn)__ob__:?Observer無法取值問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例
本文主要介紹了vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

