vue3怎样实现变量双向绑定

本文介绍了如何将Vue2中的data方法迁移到Vue3,分别通过reactive和ref进行双向绑定,并展示了在模板和setup函数中的使用实例。

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('测试数据1')
        onMounted({
            data.value = '测试数据2'
        })
        return {
            data
        }
    }
}
</script>

Vue 3 中,数据的双向绑定主要通过 `v-model` 指令和响应式系统(`ref` 和 `reactive`)实现Vue 3 借助 `Proxy` 实现了更强大的响应式机制,使得数据变化能够自动更新视图,同时通过 `v-model` 实现表单元素与数据之间的双向同步。 ### 实现方式详解: #### 1. 使用 `v-model` 实现表单元素的双向绑定 `v-model` 是语法糖,本质上是 `:value` + `@input` 的简写。在 Vue 3 中,`v-model` 默认使用 `modelValue` 作为 prop 名,`update:modelValue` 作为事件名。 ```vue <template> <div> <input v-model="message" placeholder="请输入内容" /> <p>输入的内容是:{{ message }}</p> </div> </template> <script setup> import { ref } from &#39;vue&#39; const message = ref(&#39;&#39;) </script> ``` **解释**: - `ref()` 创建一个响应式引用,`message` 初始为空字符串。 - `v-model="message"` 将输入框的值与 `message` 变量绑定。 - 当用户输入时,触发 `input` 事件,`message` 自动更新,进而视图重新渲染。 --- #### 2. 在自定义组件中使用 `v-model` 你也可以在自定义组件中实现 `v-model`,需要接收 `modelValue` 并 emit `update:modelValue` 事件。 ```vue <!-- ChildComponent.vue --> <template> <input :value="modelValue" @input="$emit(&#39;update:modelValue&#39;, $event.target.value)" placeholder="请输入" /> </template> <script setup> defineProps([&#39;modelValue&#39;]) defineEmits([&#39;update:modelValue&#39;]) </script> ``` ```vue <!-- ParentComponent.vue --> <template> <div> <child-component v-model="text" /> <p>当前文本:{{ text }}</p> </div> </template> <script setup> import { ref } from &#39;vue&#39; import ChildComponent from &#39;./ChildComponent.vue&#39; const text = ref(&#39;默认值&#39;) </script> ``` **解释**: - `v-model` 在父子组件间实现了数据的双向绑定。 - 父组件传递 `text` 给子组件的 `modelValue`。 - 子组件通过 `$emit(&#39;update:modelValue&#39;)` 通知父组件更新 `text`。 --- #### 3. 使用多个 `v-model`(Vue 3 新特性) Vue 3 支持在一个组件上使用多个 `v-model`,通过指定不同的 `model` 名称。 ```vue <!-- Parent --> <template> <custom-input v-model:title="pageTitle" v-model:content="pageContent" /> <p>标题:{{ pageTitle }}</p> <p>内容:{{ pageContent }}</p> </template> <script setup> import { ref } from &#39;vue&#39; import CustomInput from &#39;./CustomInput.vue&#39; const pageTitle = ref(&#39;默认标题&#39;) const pageContent = ref(&#39;默认内容&#39;) </script> ``` ```vue <!-- CustomInput.vue --> <template> <div> <input :value="title" @input="$emit(&#39;update:title&#39;, $event.target.value)" placeholder="标题" /> <textarea :value="content" @input="$emit(&#39;update:content&#39;, $event.target.value)" placeholder="内容" ></textarea> </div> </template> <script setup> defineProps([&#39;title&#39;, &#39;content&#39;]) defineEmits([&#39;update:title&#39;, &#39;update:content&#39;]) </script> ``` **解释**: - 每个 `v-model:title` 对应 `title` prop 和 `update:title` 事件。 - 这种方式解耦了多个数据的双向绑定。 --- #### 4. 使用 `.sync` 修饰符(已废弃,推荐用 `v-model`) Vue 3 中 `.sync` 已被移除,统一使用 `v-model` 或自定义参数的 `v-model`。 --- ### 核心原理 Vue 3 的响应式系统基于 `Proxy` 实现: - `ref`:将基本类型包装成响应式对象(内部也是通过 `Proxy` 包装一个 `{ value: ... }` 对象)。 - `reactive`:直接使用 `Proxy` 包装对象,拦截其属性的 get/set。 - 当数据变化时,依赖收集的副作用函数(如组件渲染)会重新执行,从而更新 DOM。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值