成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue 子組件修改 Props 值常見的錯誤寫法,你學會了嗎?

開發 前端
在 Vue 中,props 應被視為只讀的,直接修改 props 會導致難以追蹤的 bug,并且違反了單向數據流的原則。

圖片圖片

Vue 子組件修改props值常見的錯誤寫法

在 Vue 中,props 應被視為只讀的,直接修改 props 會導致難以追蹤的 bug,并且違反了單向數據流的原則。

以下是一些常見的錯誤寫法及其解釋,以及正確的處理方法。

1. 常見錯誤寫法

1.1. 直接修改 props

直接修改 props 是最常見的錯誤之一。

這種做法會導致 Vue 控制臺輸出警告,并且可能會導致不可預測的行為。

<template>
  <div>
    <p>{{ title }}</p>
    <button @click="updateTitle">Update Title</button>
  </div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  title: String
});

const updateTitle = () => {
  props.title = 'New Title'; // 錯誤:直接修改 props
};
</script>

1.2. 使用 v-model 但未正確處理

雖然 v-model 可以實現雙向綁定,但如果使用不當,仍然會導致問題。

<template>
  <div>
    <p>{{ title }}</p>
    <input v-model="title"> <!-- 錯誤:直接綁定到 props -->
  </div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  title: String
});
</script>

1.3. 在 data 中直接使用 props

在 data 中直接使用 props 會導致數據的重復和不一致。

<template>
  <div>
    <p>{{ localTitle }}</p>
    <button @click="updateTitle">Update Title</button>
  </div>
</template>

<script setup>
import { ref, defineProps } from 'vue';

const props = defineProps({
  title: String
});

const localTitle = ref(props.title); // 錯誤:未處理 props 的變化

const updateTitle = () => {
  localTitle.value = 'New Title';
};
</script>

2. 正確的處理方法

2.1. 使用局部狀態

在子組件中創建一個局部狀態來存儲 prop 的值,并在需要時更新這個局部狀態。

使用 watch 來監聽 prop 的變化。

<template>
  <div>
    <p>{{ localTitle }}</p>
    <button @click="updateLocalTitle">Update Title</button>
  </div>
</template>

<script setup>
import { ref, watch, defineProps } from 'vue';

const props = defineProps({
  title: String
});

const localTitle = ref(props.title);

watch(() => props.title, (newVal) => {
  localTitle.value = newVal;
});

const updateLocalTitle = () => {
  localTitle.value = 'New Title';
};
</script>

2.2. 使用 $emit 發送事件

如果需要將子組件中的更改通知給父組件,可以使用 $emit 發送事件,讓父組件來更新數據。

2.2.1. 子組件
<template>
  <div>
    <p>{{ title }}</p>
    <button @click="updateTitle">Update Title</button>
  </div>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

const props = defineProps({
  title: String
});

const emit = defineEmits(['update:title']);

const updateTitle = () => {
  emit('update:title', 'New Title');
};
</script>
2.2.2. 父組件
<template>
  <ChildComponent :title="title" @update:title="updateTitle" />
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const title = ref('Initial Title');

const updateTitle = (newTitle) => {
  title.value = newTitle;
};
</script>

2.3. 使用計算屬性

如果需要基于 props 的值進行一些計算,可以使用計算屬性來實現。

<template>
  <div>
    <p>{{ computedTitle }}</p>
  </div>
</template>

<script setup>
import { defineProps, computed } from 'vue';

const props = defineProps({
  title: String
});

const computedTitle = computed(() => {
  return `Modified: ${props.title}`;
});
</script>

2.4. 使用 v-model 或自定義模型

Vue 3 支持 v-model 的自定義修飾符,可以更方便地實現雙向綁定。

2.4.1. 子組件
<template>
  <div>
    <p>{{ title }}</p>
    <input v-model="localTitle" @input="onInput">
  </div>
</template>

<script setup>
import { defineProps, defineEmits, computed } from 'vue';

const props = defineProps({
  modelValue: String
});

const emit = defineEmits(['update:modelValue']);

const localTitle = computed({
  get: () => props.modelValue,
  set: (value) => emit('update:modelValue', value)
});

const onInput = (event) => {
  emit('update:modelValue', event.target.value);
};
</script>
2.4.2. 父組件
<template>
  <ChildComponent v-model:title="title" />
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const title = ref('Initial Title');
</script>

3. 總結

  • 直接修改 props:會導致 Vue 控制臺警告和不可預測的行為。
  • 使用 v-model 但未正確處理:可能導致數據綁定錯誤。
  • 在 data 中直接使用 props:導致數據的重復和不一致。

通過使用局部狀態、發送事件、計算屬性或自定義模型,可以在不直接修改 props 的情況下,實現所需的功能,同時保持組件的可維護性和可預測性。

責任編輯:武曉燕 來源: 前端愛好者
相關推薦

2023-12-26 10:12:19

虛擬DOM數據

2022-07-08 09:27:48

CSSIFC模型

2024-08-30 14:34:00

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2022-12-09 09:21:10

分庫分表算法

2023-06-27 07:21:51

前端開發坑點

2024-10-14 09:34:39

vue3通信emit

2023-10-30 11:40:36

OOM線程池單線程

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區

2023-01-30 09:01:54

圖表指南圖形化

2024-08-06 09:47:57

2023-12-12 08:02:10

2024-11-27 11:07:20

vue計算屬性

2024-02-02 11:03:11

React數據Ref

2024-01-02 12:05:26

Java并發編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片视频网站 | 精品视频在线免费观看 | 狠狠爱免费视频 | 国产一级精品毛片 | 91精品导航 | 亚洲精品欧美 | 国产精品视频导航 | 又黄又爽的网站 | 中文字幕一区二区三区四区五区 | 精品无码久久久久国产 | 久久精品国产久精国产 | 色噜噜色综合 | 精品久久久久久久久久久久久久 | 午夜免费视频观看 | av一二三区 | www国产成人免费观看视频 | 日韩欧美国产不卡 | 美女天天操 | 91av导航| 三级在线免费 | 亚洲综合字幕 | 国产一级网站 | 蜜桃av一区二区三区 | 开操网| 午夜在线免费观看 | 日韩欧美国产精品 | 在线观看中文字幕一区二区 | 欧美精品一区二区三区四区 | 欧美成人一区二区三区 | 免费看a | 一区网站 | 欧美三级视频 | 中文字幕在线观看日韩 | 久久免费大片 | 欧美一区二区 | 91直接看 | 日韩在线观看一区 | 午夜在线电影网 | 一级黄色在线 | 久久亚洲一区二区三区四区 | 福利网址 |