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('測試數(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>
向子組件傳遞單個(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ù),并對其依賴項(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。
代碼更簡潔,性能更強(qiáng)悍,更好的支持 TS。
<!-- 語法格式 --> <script setup> // 引入第三方,定義變量、方法等 </script>
defineProps
defineProps 用于接收父組件傳遞過來的值,可以直接使用無需導(dǎo)入。實(shí)質(zhì)上就是一個(gè) 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, // 是否必傳 } }); // 也可以使用變量接收,使用時(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)限,能訪問的頁面是不一樣的,所以我們在寫后臺(tái)管理系統(tǒng)時(shí)就會(huì)遇過這樣的需求:根據(jù)后臺(tái)數(shù)據(jù)動(dòng)態(tài)添加路由和菜單,這篇文章主要給大家介紹了關(guān)于vue配置文件自動(dòng)生成路由和菜單的相關(guān)資料,需要的朋友可以參考下2021-08-08vue-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ì),對大家學(xué)習(xí)學(xué)習(xí)或者使用vue3具有一定的參考解決價(jià)值,需要的朋友可以參考下2024-05-05Vue數(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-03vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例
本文主要介紹了vue高德地圖JS API實(shí)現(xiàn)海量點(diǎn)標(biāo)記示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08