当前位置:   article > 正文

vue3+js+vite学习之响应式问题总结_v3+vite响应式布局

v3+vite响应式布局
一、组件之间传参,props数据有时丢失响应性,页面不刷新

因为直接对props的数据进行解构,例如const {a} = props,会使数据丢失响应性,需要使用toRefs和toRef保持响应性。另外直接使用props.xxx 的方式,数据不会丢失响应性。

因此,props保持响应性的方法总结如下:

1、通过 props.xxx 的形式来使用其中的 props。(在script中使用的时候,后面不需要再加.value获取值)

2、通过解构 props对象的方式调用时,需要使用toRefs和toRef来保持数据具有响应性。(在script中使用的时候,需要加.value获取值,因为现在是ref类型)

示例如下:

  • 父组件
  1. <template>
  2. <child-component :text="text"></child-component>
  3. </template>
  4. <script setup>
  5. import { ref } from 'vue'
  6. const text = ref('初始值')
  7. setTimeout(() => {
  8. text.value = '变化值'
  9. }, 2000)
  10. </script>
  • 子组件(方法一 props.xxx)
  1. <template>
  2. <div>{{ props.text }}</div>
  3. </template>
  4. <script setup>
  5. const props = defineProps({
  6. text: {
  7. type: String,
  8. default: ''
  9. }
  10. })
  11. // 获取值
  12. console.log('value:',props.text)
  13. </script>
  • 子组件(方法二 toRefs和toRef 解构props)
  1. <template>
  2. <div>{{ text }}</div>
  3. </template>
  4. <script setup>
  5. import { toRefs, toRef } from 'vue'
  6. const props = defineProps({
  7. text: {
  8. type: String,
  9. default: ''
  10. }
  11. })
  12. // 将 `props` 转为一个其中全是 ref 的对象,然后解构
  13. const { text } = toRefs(props)
  14. // 获取值
  15. console.log('value:',text.value)
  16. // 或者,将 `props` 的单个属性转为一个 ref
  17. const { text1 } = toRef(props, 'text')
  18. // 获取值
  19. console.log('value:',text1.value)
  20. </script>
二、使用pinia定义store,页面获取store的数据,有时丢失响应性

store 是一个用 reactive 包裹的对象,这意味着不需要在getter 之后写.value,但是,就像setup中的props一样,我们不能对其进行解构,需要结合storeToRefs使用。另外直接使用store.xxx的形式,或者使用computed的方式也不会丢失响应性。

因此,store数据保持响应性的方法总结如下:

1、通过 store.xxx 的形式直接使用。(在script中使用的时候,后面不需要再加.value获取值)

2、通过computed计算属性的方式获取store的数据,在页面中使用。(在script中使用的时候,需要加.value获取值,因为computed需要加.value)

3、从 store 中提取属性时,保持其响应式,您需要使用storeToRefs。它将为任何响应式属性创建 refs。(在script中使用的时候,需要加.value获取值,因为现在是ref类型)

 示例如下:

  • store文件
  1. import { ref } from 'vue'
  2. import { defineStore } from 'pinia'
  3. export const useSystemInfoStore = defineStore('systemInfo', () => {
  4. const title = ref('hello world')
  5. return {
  6. title
  7. }
  8. })
  • 组件(方法一 直接使用)
  1. <template>
  2. <div>
  3. {{ systemInfoStore.title }}
  4. </div>
  5. </template>
  6. <script setup>
  7. import { computed } from 'vue'
  8. import { useSystemInfoStore } from '@/store/systemInfoStore'
  9. const systemInfoStore = useSystemInfoStore()
  10. // 获取值
  11. console.log('value:',systemInfoStore.title)
  12. </script>
  • 组件(方法二 computed)
  1. <template>
  2. <div>
  3. {{ title }}
  4. </div>
  5. </template>
  6. <script setup>
  7. import { computed } from 'vue'
  8. import { useSystemInfoStore } from '@/store/systemInfoStore'
  9. const systemInfoStore = useSystemInfoStore()
  10. const title = computed(() => systemInfoStore.title);
  11. // 获取值 computed必须加.value
  12. console.log('value:',title.value)
  13. </script>
  • 组件(方法三 storeToRefs)
  1. <template>
  2. <div>
  3. {{ title }}
  4. </div>
  5. </template>
  6. <script setup>
  7. import { storeToRefs } from 'pinia'
  8. import { useSystemInfoStore } from '@/store/systemInfoStore'
  9. const systemInfoStore = useSystemInfoStore()
  10. // 使用storeToRefs解构
  11. const { title } = storeToRefs(systemInfoStore)
  12. // 获取值
  13. console.log('value:',title.value)
  14. </script>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/970885
推荐阅读
相关标签
  

闽ICP备14008679号