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

每日,一题,探究,响应,本质,简单,方式,理解 · 浏览次数 : 14

小编点评

## Summary of Vue Content This document explains different ways to achieve dynamic updates in Vue components using props and computed properties. **1. Reactivity without Functions:** - Props are used directly as data sources in the template. - Data changes trigger immediate updates because Vue detects changes. - This approach works for simple structures but may not be optimal for complex data structures. **2. Using `watchEffect`:** - `watchEffect` is a lifecycle hook that allows us to track changes in a data source. - It triggers an update function whenever the data changes. - This approach is efficient and allows for fine-grained control over updates. **3. Using `computed`:** - `computed` properties are functions that return a single, computed value based on multiple data sources. - They are computed lazily, only when accessed in the template. - This approach is useful for performing complex calculations or fetching data. **4. Using `useDouble` function:** - This function takes a prop as an argument and returns a computed property. - It uses `watchEffect` to track changes in the prop and updates the computed property accordingly. - This approach allows for dynamic calculations based on prop changes. **5. Passing Props with `watchEffect`:** - `watchEffect` can be used to track changes in any prop, regardless of its type. - We can pass complex objects and arrays as props and access their properties within the watchEffect callback. - This approach allows for flexible data handling and dynamic updates. **Overall, choosing the appropriate approach depends on the complexity of your data structure, performance requirements, and desired control over updates.**

正文

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。

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

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

1、响应式本质 就是把数据和函数相关联起来,当数据变化时,函数自动执行。当然这对于函数和数据也是有要求的 函数必须是以下几种: render computed watch watchEffect 数据必须是以下几种: 响应式数据 在函数中用到的数据 2、例子 2.1

每日一题:通过css变量来控制主题

1、定义不同主题颜色 :root{ --theme-color: blue; --font-size: 18px;; } html[theme="dark"]{ --theme-color: #000; 2、通过切换html自定义属性来控制主题

每日一题:吃透大文件上传问题(附可运行的前后端源码)

大文件上传 前言 在日常开发中,文件上传是常见的操作之一。文件上传技术使得用户可以方便地将本地文件上传到Web服务器上,这在许多场景下都是必需的,比如网盘上传、头像上传等。 但是当我们需要上传比较大的文件的时候,容易碰到以下问题: 上传时间比较久 中间一旦出错就需要重新上传 一般服务端会对文件的大小

每日一题: 细说es6中的Reflect

1、Reflect是什么,有什么作用? Reflect是ES6为了操作对象而新增的API,Reflect对象是一个全局的普通的对象,Reflect的原型就是Object. 作用:将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上

每日一题:无感刷新页面(附可运行的前后端源码,前端vue,后端node)

1、前言 想象下,你正常在网页上浏览页面。突然弹出一个窗口,告诉你登录失效,跳回了登录页面,让你重新登录。你是不是很恼火。这时候无感刷新的作用就体现出来了。 2、方案 2.1 redis设置过期时间 在最新的技术当中,token一般都是在Redis服务器存着,设置过期时间。只要在有效时间内,重新发出

每日一题:AJAX进度监控(附可运行源码)

1、什么是AJAX AJAX(Asynchronous JavaScript and XML)是一种用于在网页上进行异步通信的技术。它允许在不刷新整个页面的情况下,通过在后台与服务器进行数据交换来更新部分网页内容。 传统的网页开发中,当用户与网页进行交互时,需要刷新整个页面才能获取最新的内容。而使用

每日一题:vue3自定义指令大全(呕心沥血所作,附可运行项目源码)

1.VUE常用指令大全 本项目所有指令均为全局注册,使用时直接在组件中使用即可。 指令目录:src/directives 页面目录:src/views 具体可查看源码 1.1 权限指令 封装一个权限指令,在模板中根据用户权限来控制元素的显示或隐藏。 permission.js import { re

每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)

1、不要使用Object.prototype.toString.call() 正常情况下: const arr = [1,2,3,4,5] const obj = {} console.log(Object.prototype.toString.call(arr))//[Object,Array]

文心一言 VS 讯飞星火 VS chatgpt (112)-- 算法导论10.2 3题

三、用go语言,用一个单链表L实现一个队列。要求操作 ENQUEUE 和 DEQUEUE 的运行时间仍为O(1)。 文心一言: 在 Go 语言中,使用单链表实现队列的操作,包括入队(ENQUEUE)和出队(DEQUEUE),并保持操作的时间复杂度为 O(1),需要利用两个指针,一个指向队头,另一个指

文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题

一、用go语言,单链表上的动态集合操作 INSERT 能否在 O(1)时间内实现?DELETE 操作呢? 文心一言: 在单链表中,INSERT 和 DELETE 操作的时间复杂度通常是 O(n),其中 n 是链表中的元素数量。这主要是因为当你插入或删除元素时,你需要遍历链表来找到正确的插入或删除位置