VUE框架Vue3下使用基于Proxy的reactive函数实现对象的响应式处理与对象的子对象和数组响应式处理------VUE框架

<template>
    <h1>{{ userProxy.name }}</h1>
    <h1>{{ userProxy.age }}</h1>
    <h1>{{ userProxy.counter }}</h1>
    <h1>{{ userProxy.addr.city }}</h1>
    <h1>{{ userProxy.addr.street }}</h1>
    <h2>{{ num }}</h2>
    <h1>{{ userProxy.sex }}</h1>
    <h1>选课列表</h1>
    <ul>
        <li v-for="course in userProxy.courses" :key="course[course]">{{ course }}</li>
    </ul>
    <button @click="modifyUser()">修改</button>
    <button @click="addSex()">添加性别</button>
    <button @click="delSex()">删除性别</button>
    <button @click="changeCourse()">修改课程</button>
</template>

<script>
import { reactive, ref } from 'vue'
export default {
    name : "App",
    setup(){
        // ref主要用于基本数据类型
        // reactive专门用于对象类型,不能用于基本数据类型
        let userProxy = reactive({
            name : "Jack",
            age : 20,
            counter : 100,
            // 对象里面的对象也可以基于这个实现响应式处理
            addr : {
                city : "北京",
                street : "大兴区凉水河街道"
            },
            courses : ["语文","数学","英语"]
        });
        let num = ref(10000);
        // 基本数据类型是完全不可以使用reactive来做响应式处理的
        console.log(userProxy);
        // 如果是基本数据类型想做响应式处理,还是要使用ref函数来处理
        function modifyUser(){
            // 这里我们用reactive直接就是响应式的,不需要对这个代理对象的value进行修改
            // 这个函数可以直接以代理的方式去实现响应式处理
            userProxy.name = "Rose";
            userProxy.age = 30;
            userProxy.counter = 200;
            userProxy.addr.city = "南京";
            userProxy.addr.street = "雨花石街";
            userProxy.sex = "女";
        }
        function addSex(){
            // 添加性别
            userProxy.sex = "男";
        }
        function delSex(){
            // 删除性别
            delete userProxy.sex;
        }
        function changeCourse(){
            userProxy.courses[2] = "政治";
        }
        return {userProxy,num,modifyUser,addSex,delSex,changeCourse};
    }
}
</script>

<style>

</style>

<template>

    <h1>{{ userProxy.name }}</h1>

    <h1>{{ userProxy.age }}</h1>

    <h1>{{ userProxy.counter }}</h1>

    <h1>{{ userProxy.addr.city }}</h1>

    <h1>{{ userProxy.addr.street }}</h1>

    <h2>{{ num }}</h2>

    <h1>{{ userProxy.sex }}</h1>

    <h1>选课列表</h1>

    <ul>

        <li v-for="course in userProxy.courses" :key="course[course]">{{ course }}</li>

    </ul>

    <button @click="modifyUser()">修改</button>

    <button @click="addSex()">添加性别</button>

    <button @click="delSex()">删除性别</button>

    <button @click="changeCourse()">修改课程</button>

</template>

<script>

import { reactive, ref } from 'vue'

export default {

    name : "App",

    setup(){

        // ref主要用于基本数据类型

        // reactive专门用于对象类型,不能用于基本数据类型

        let userProxy = reactive({

            name : "Jack",

            age : 20,

            counter : 100,

            // 对象里面的对象也可以基于这个实现响应式处理

            addr : {

                city : "北京",

                street : "大兴区凉水河街道"

            },

            courses : ["语文","数学","英语"]

        });

        let num = ref(10000);

        // 基本数据类型是完全不可以使用reactive来做响应式处理的

        console.log(userProxy);

        // 如果是基本数据类型想做响应式处理,还是要使用ref函数来处理

        function modifyUser(){

            // 这里我们用reactive直接就是响应式的,不需要对这个代理对象的value进行修改

            // 这个函数可以直接以代理的方式去实现响应式处理

            userProxy.name = "Rose";

            userProxy.age = 30;

            userProxy.counter = 200;

            userProxy.addr.city = "南京";

            userProxy.addr.street = "雨花石街";

            userProxy.sex = "女";

        }

        function addSex(){

            // 添加性别

            userProxy.sex = "男";

        }

        function delSex(){

            // 删除性别

            delete userProxy.sex;

        }

        function changeCourse(){

            userProxy.courses[2] = "政治";

        }

        return {userProxy,num,modifyUser,addSex,delSex,changeCourse};

    }

}

</script>

<style>

</style>

### 回答1: 在Vue 3中,可以使用 `reactive` 函数将一个对象转换为响应式对象。当响应式对象中的属性值发生变化时,Vue 3会自动更新与该属性相关的视图。 在Vue 3中,更改响应式对象的属性值时,Vue 3会使用 Proxy 拦截这个更改操作,并触发更新。具体来说,当你尝试修改响应式对象的属性值时,Vue 3会首先使用 Proxy 拦截这个操作,然后会通知相关的视图进行更新。 以下是一个示例,演示了如何在Vue 3中创建响应式对象,并且在更改对象的属性值时如何实现自动更新相关的视图: ```js import { reactive } from 'vue' // 创建一个响应式对象 const user = reactive({ name: 'John', age: 30 }) // 视图会自动更新 console.log(user.name) // 输出 'John' user.name = 'Mike' // 视图会自动更新 console.log(user.name) // 输出 'Mike' ``` 在上面的示例中,我们创建了一个名为 `user` 的响应式对象,它有两个属性:`name` 和 `age`。我们可以像访问普通对象一样访问响应式对象中的属性,例如 `user.name`。如果我们更改 `user` 对象的属性,例如 `user.name = 'Mike'`,Vue 3会自动更新相关的视图。这意味着,任何绑定到 `user.name` 的视图都会更新,以反映 `user.name` 的新值。 ### 回答2: vue3在改变对象值时会执行Proxy的拦截器,实现响应式展示。当改变对象的某个属性值时,会触发Proxy的set拦截器,并通过Reflect.set方法来更新对象的属性值。 具体来说,当我们通过赋值的方式改变对象的属性值时,如: ``` data.foo = 'new value'; ``` Vue会首先判断这个对象是否已经被代理过,如果已经被代理,则会触发Proxy的set拦截器。在拦截器中,会比较新值与旧值是否相等,如果相等则不做任何处理,如果不相等,则会更新对象的属性值,并触发相关的响应式更新。 需要注意的是,如果对象的属性值是一个对象数组,改变属性的值时,也会触发Proxy的set拦截器,同样会进行响应式更新。Vue利用了递归的方式来处理多层嵌套的数据结构,保证了整个对象响应式更新。 总结一下,Vue3在改变对象值时,通过Proxy的set拦截器来实现响应式展示。这种方式可以有效地追踪对象值的变化,并高效地进行相关的响应式更新。 ### 回答3: 在Vue3中,当我们改变一个对象的值时,它会通过Proxy的方式进行响应式展示。 Vue3中引入了一个新的API,即`reactive`,用于将一个普通的JavaScript对象转换为响应式对象。当我们将一个对象通过`reactive`进行转换后,对象中的每个属性都会被转换为响应式属性,即当属性值发生改变时,会触发相关的响应式更新。 在改变对象值时,Vue3会通过Proxy拦截器来实现响应式的更新。当我们修改对象的属性值时,Proxy会捕获这个修改操作,并触发相关的响应式更新。这种机制保证了当我们修改对象的属性值时,相关的组件能够及时地更新展示。 举个例,假设我们有一个对象`user`,其中有一个属性`name`,我们将`user`对象通过`reactive`转换为响应式对象: ``` import { reactive } from 'vue'; const user = reactive({ name: 'Alice' }); ``` 现在,当我们修改`user`对象的`name`属性时: ``` user.name = 'Bob'; ``` Vue3会捕获这个修改操作,并触发相关的响应式更新,如果有组件在模板中使用了`user.name`,那么它会及时地更新展示为`Bob`。 需要注意的是,当我们添加或删除对象的属性时,Vue3默认不会进行响应式转换。如果我们需要对新添加的属性进行响应式,可以使用`reactive`的另一个相关API,即`shallowReactive`来实现。这样,新添加的属性也会成为响应式属性,支持相关的响应式更新。 以上就是Vue3在改变对象值时如何响应式展示的简要说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值