• vue3-3-响应式数据与watch属性


    reactive与ref-细节

    1. 是Vue3的 composition API中2个最重要的响应式API
    2. ref用来处理基本类型数据, reactive用来处理对象(递归深度响应式)
    3. 如果用ref对象/数组, 内部会自动将对象/数组转换为reactive的代理对象
    4. ref内部: 通过给value属性添加getter/setter来实现对数据的劫持
    5. reactive内部: 通过使用Proxy来实现对对象内部所有数据的劫持, 并通过Reflect操作对象内部数据
    6. ref的数据操作: 在js中要.value, 在模板中不需要(内部解析模板时会自动添加.value)
    <template>
      <div>ref与</div>
      <div>msg1:{{msg1}}</div>
      <div>msg2:{{msg2}}</div>
      <div>msg3:{{msg3}}</div>
      <button @click="updata">改变</button>
    </template>
    
    <script lang="ts">
    import {reactive, ref} from "vue";
    export default {
      setup(){
        const msg1=ref('hello')
        const msg2 = reactive({
          name: 'jack',
          wife: {
            name:'rose'
          }
        })
        const msg3 = ref({ // ref中如果是一个对象,那么经过了reactive处理,形成了Proxy对象
          name: 'jack',
          wife: {
            name: 'rose'
          }
        })
        function updata(){
          msg1.value += '++'
          msg2.wife.name += '++'
          msg3.value.wife.name += '++'
        }
        return {
          msg1,
          msg2,
          msg3,
          updata
        }
      }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    计算属性与监视

    computed函数:

    1. 与computed配置功能一致
    2. 有getter/setter

    与watch配置功能一致

    1. 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调
    2. 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次
    3. 通过配置deep为true, 来指定深度监视

    watchEffect函数

    1. 不用直接指定要监视的数据, 回调函数中使用的哪些响应式数据就监视哪些响应式数据
    2. 默认初始时就会执行第一次, 从而可以收集需要监视的数据
    3. 监视数据发生变化时回调
    <template>
      <h1>计算属性与监视</h1>
      <fieldset>
        <legend>姓名操作</legend>
        姓氏:<input type="text" placeholder="输入姓氏" v-model="user.firstName"><br>
        名字:<input type="text" placeholder="输入名字" v-model="user.lastName">
      </fieldset>
      <fieldset>
        <legend>计算属性和监视</legend>
        姓名:<input type="text" placeholder="显示姓名" v-model="fullName1"><br>
        姓名:<input type="text" placeholder="显示姓名" v-model="fullName2"><br>
        姓名:<input type="text" placeholder="显示姓名" v-model="fullName3"><br>
      </fieldset>
    </template>
    
    <script lang="ts">
    import {reactive, ref, computed, watch, watchEffect} from "vue";
    export default {
      setup() {
        const user=reactive({
          firstName:'东方',
          lastName: '不败'
        })
        /*
        * Vue3中的计算属性
        * 计算属性如果只传入一个回调函数,那么表示get
        * 返回的是一个ref对象
        * */
        const fullName1=computed(()=>{
          return user.firstName + '-' + user.lastName
        })
        const fullName2=computed({
          get(){
            return user.firstName + '-' + user.lastName
          },
          set(val){
            const name=val.split('-')
            user.firstName=name[0]
            user.lastName=name[1]
          }
        })
        // 监视属性
        let fullName3=ref('')
        watch(user,({firstName,lastName})=>{ // user里面对象解构赋值
          fullName3.value=firstName + '-' +lastName
        },{immediate:true}) // immediate 开始时执行一次 还可以加deep 深度监视
        // watchEffect(()=>{
        //   fullName3.value=user.firstName + '-' +user.lastName
        // }) // 更智能,开始就自动执行一次
    
        /*
        * wathc可以监视多个属性,监听非响应式数据时,需要()=>
        * */
        watch([()=>user.firstName,()=>user.lastName],()=>{
          console.log("watch执行了")
        })
        return {
          user,
          fullName1,
          fullName2,
          fullName3
        }
      }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
  • 相关阅读:
    Go 项目代码布局
    Dubbo高手之路6,Dubbo 服务治理详解
    [论文阅读] SADGA: Structure-Aware Dual Graph Aggregation Network for Text-to-SQL
    基于Python PHP+mysql的校园电脑外设的电商平台
    采用sFlow工具实现流量监控--实验
    xgboost 与 lgbm
    基于遗传算法的二进制图像重建(Matlab代码实现)
    自动驾驶传感器技术
    HashMap与HashTable、HashSet的区别
    Flutter超好用的路由库-fluro
  • 原文地址:https://blog.csdn.net/weixin_64925940/article/details/124807023