首页 > 其他分享 >每日一题:探究响应式本质,以最简单的方式理解响应式

每日一题:探究响应式本质,以最简单的方式理解响应式

时间:2023-10-12 15:46:11浏览次数:48  
标签:count const computed watchEffect 本质 响应 探究 props doubleCount

1、响应式本质

就是把数据和函数相关联起来,当数据变化时,函数自动执行。当然这对于函数和数据也是有要求的

函数必须是以下几种:

render

computed

watch

watchEffect

数据必须是以下几种:

响应式数据

在函数中用到的数据

2、例子

2.1

<template>
  <div class="responsive">
    <h1>responsive</h1>
    <div>传入的值:{{ count }}</div>
    <br>
    <div>doubled:{{doubleCount}}</div>
    <br>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'
const props = defineProps({
  count: {
    type: Number,
    default: 0
  }
})
const doubleCount =ref(props.count * 2)
</script>

<style scoped>

</style>

结果:

当我们点击增加按钮时,页面并没有发生变化,这是因为我们的doubleCount并没有响应式。

原因:const doubleCount =ref(props.count * 2)这一过程不涉及到任何函数,数据和数据之间是无法形成关联的,所以doubleCount并不是响应式的。

2.2

<template>
  <div class="responsive">
    <h1>responsive</h1>
    <div>传入的值:{{ count }}</div>
    <br>
    <div>doubled:{{doubleCount}}</div>
    <br>
  </div>
</template>

<script setup>
import { ref, computed ,watchEffect} from 'vue'
const props = defineProps({
  count: {
    type: Number,
    default: 0
  }
})
const doubleCount =ref(0)
watchEffect(() => {
  console.log('watchEffect')
  doubleCount.value = props.count * 2
})
</script>

<style scoped>

</style>

结果:

当我们点击增加按钮时,页面发生了变化,这是因为我们的doubleCount是响应式的。

原因:
函数与数据关联起来了;

1、watchEffect是一个函数,props.count是一个响应式数据,且在watchEffect中用到了,所以props.count变化了,watchEffect就会执行,导致doubleCount变化;
2、doubleCount也是个响应式数据,在render函数中用到了,所以doubleCount变化了,render函数就会执行,更新页面。

2.3

<template>
  <div class="responsive">
    <h1>responsive</h1>
    <div>传入的值:{{ count }}</div>
    <br>
    <div>doubled:{{doubleCount}}</div>
    <br>
  </div>
</template>

<script setup>
import { ref, computed ,watchEffect} from 'vue'
const props = defineProps({
  count: {
    type: Number,
    default: 0
  }
})
function useDouble(count) {
  const doubleCount =ref(0)
  watchEffect(() => {
    console.log('watchEffect')
    doubleCount.value = count * 2
  })
  return doubleCount
}
const doubleCount = useDouble(props.count)

</script>

<style scoped>

</style>

结果:

当我们点击增加按钮时,页面未发生变化。

原因:
useDouble函数传的参数是一个原始值,没有读到任何响应式数据。所以doubleCount不会更新,从而render函数也不会执行。

2.4

<template>
  <div class="responsive">
    <h1>responsive</h1>
    <div>传入的值:{{ count }}</div>
    <br>
    <div>doubled:{{doubleCount}}</div>
    <br>
  </div>
</template>

<script setup>
import { ref, computed ,watchEffect} from 'vue'
const props = defineProps({
  count: {
    type: Number,
    default: 0
  }
})
const doubleCount = computed(() => {
  console.log('computed')
  return props.count * 2
})

</script>

<style scoped>

</style>

结果:

当我们点击增加按钮时,页面发生了变化。

原因:

1、computed是一个函数,props.count是一个响应式数据,且在computed中用到了,所以props.count变化了,computed就会执行,导致doubleCount变化;
2、doubleCount也是个响应式数据,在render函数中用到了,所以doubleCount变化了,render函数就会执行,更新页面。

2.5

<template>
  <div class="responsive">
    <h1>responsive</h1>
    <div>传入的值:{{ count }}</div>
    <br>
    <div>doubled:{{doubleCount}}</div>
    <br>
  </div>
</template>

<script setup>
import { ref, computed ,watchEffect} from 'vue'
const props = defineProps({
  count: {
    type: Number,
    default: 0
  }
})
function useDouble(props) {
  const doubleCount =ref(0)
  watchEffect(() => {
    console.log('watchEffect')
    doubleCount.value = props.count * 2
  })
  return doubleCount
}
const doubleCount = useDouble(props)

</script>

<style scoped>

</style>

结果:

当我们点击增加按钮时,页面发生变化。
原因:
1、props是一个响应式数据,跟watchEffect关联起来了,所以当props.count变化时,watchEffect就会执行,导致doubleCount变化;
2、doubleCount也是个响应式数据,在render函数中用到了,所以doubleCount变化了,render函数就会执行,更新页面。

tips:VueUse库中的基本都是传的props。

标签:count,const,computed,watchEffect,本质,响应,探究,props,doubleCount
From: https://www.cnblogs.com/never404/p/17759648.html

相关文章

  • jmeter 提取一个或多个响应值保存到csv文件中,用beanshell实现脚本
    importorg.json.JSONObject;//写入文件//本地存储文件路径FileWriterfs=newFileWriter("D:/apache-jmeter-5.1.1/bin/token.csv",true);BufferedWriterout=newBufferedWriter(fs);//提取出来的token,并通过,换列out.write("${sessionStr}");out.write(",");ou......
  • 对于2016年浙江高考最后一题的探究
    (1)当\(|a_1|\leq2\),此时\(2^{n-1}(|a_1|-2)<0<|a_n|\),得证当\(|a_1|>2\),\(|a_n-\frac{a_{n+1}}{2}|\leq1,2a_n-2\leqa_{n+1}\leq2a_n+2\)使用数学归纳法,假设\(2^{n-1}(|a_1|-2)<|a_n|,-a_n<2^{n-1}(|a_1|-2)<a_n\),证明\(-a_{n+1}<2^n(|a_1|-2......
  • 基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述     平板脉冲响应(PulseResponse)是通信和雷达等领域中的重要参数,它描述了信号在空间中传播的特性。在现实应用中,获取完整的脉冲响应通常是耗时且昂贵的。基于亚奈奎斯特采样和SOMP算法的平板脉......
  • 关于 Spartacus CMS 请求响应是否应该被 Transfer State 机制 cover 的问题
    Spartacus默认设置是CMS请求会在CSR和SSR两种环境下都执行,动机是应对在页面渲染过程中,Back-Office有变化发生的情况。如果确实只希望CMS只在SSR端执行,将routing.loadStrategy改成ONCE即可。这个Stackoverflow帖子做了详细说明。打开上面的cms-store.module......
  • Vue响应式
    目录Vue中的响应式对象独立的响应式值计算变量监听响应式变量setup方法Vue中的响应式对象Vue3允许在setup()中定义组件需要的数据和方法,通过return在模板中可以直接使用reactive方法<body><divid="Application"></div><script>constApp=Vue......
  • StateFlow初步探究
    flow是如何工作的stateflow是建立在flow的基础上的,要理解stateflow,首先需要对flow有一定的了解,其实flow的原理很简单,不过是建立在了协程的基础上,假设没有协程,实际上flow就是用一个回调(FlowCollector)来进行工作的,加上了协程之后,由于协程支持中断和恢复,让flow可以匹配发送端和接......
  • 【PyQt6】Python窗口拖拽文件并响应的实现
    情景大概应用情景为:将一个文件拖入到窗口内,地址栏显示文件路径,文本框显示文件内容。说明实现拖拽必须在exec前设置QMineDate,否则不会开始拖拽操作。实现fromPyQt6.QtCoreimport*calssMainWindow(QMainWindow,Ui_MainWindow): def__init__(self): super().__init__......
  • Loadrunner脚本设计-响应内容多值匹配
    在性能效率测试过程中,参数化关联会遇到多值匹配的情况,loadrunner的脚本可以这样处理。web_reg_save_param("id", "LB=id\":", "RB=,","ord=all", LAST);//请求lr_output_message("%s",lr_eval_string("{id_1}"));上述方法......
  • metersphere接口调试时有返回响应体,但是创建接口单独测试时无响应体
    在用metersphere做接口测试时,单独做接口调试有响应体,但是放到接口中无响应体是环境配置 做接口测试时我用的都是这个mock环境,但是接口实际上调用的不是该地址,因此我在项目环境中重新建了环境就好了,需要注意的是在项目环境中配置地址时一定要点确定,不能只点更新 2、环境......
  • 造轮子之统一请求响应格式
    在上文中我们实现了统一业务异常处理,在异常响应中我们也使用了统一的响应格式返回给客户端。接下来我们就讲一下约定统一的氢气响应格式。在业务开发中,一个规范统一的请求响应格式可以提高我们的前后端开发对接效率,同时清晰的结构提高了可读性。响应基类首先定义一个最基础的只......