目錄
vue可以修改prop中的值嗎
實作
首頁 web前端 前端問答 vue可以修改prop中的值嗎

vue可以修改prop中的值嗎

Jun 16, 2022 am 10:29 AM
vue

vue中不可以直接修改prop中的值,若直接修改vue會產生警告,且修改該屬性值並不能修改父元件對應的變數;但是可以透過觸發子元件事件,父元件監聽此事件並執行修改父元件的函數,透過監聽子元件事件做到雙向資料綁定來實現修改prop中的值。

vue可以修改prop中的值嗎

本教學操作環境:windows10系統、Vue3版、Dell G3電腦。

vue可以修改prop中的值嗎

在Vue中,prop是可以接受由父元件傳遞給子元件的屬性,但prop無法進行修改的。

如果prop被強制修改,會有警告

所有的prop 都使得其父子prop 之間形成了一個單向下行綁定:父級prop 的更新會向下流動到子元件中,但是反過來則不行。這樣會防止從子元件意外變更父級元件的狀態,從而導致你的應用的資料流向難以理解。

另外,每次父級元件發生變更時,子元件中所有的 prop 都會重新整理為最新的值。這意味著你不應該在一個子元件內部改變 prop。如果你這樣做了,Vue 會在瀏覽器的控制台中發出警告。

嘗試透過下面的方法直接修改屬性值

this.$props.modelValue = true;
登入後複製

Vue 將提出警告

Set operation on key “modelValue” failed: target is readonly.

且修改該屬性值並不能修改父元件對應的變量,僅適用於基礎資料型態。

注意在JavaScript 中物件和陣列是透過引用傳入的,所以對於一個陣列或物件類型的prop 來說,在子元件中改變這個物件或陣列本身將會影響到父組件的狀態,且Vue 無法為此向你發出警告。作為一個通用規則,應該避免修改任何 prop,包括物件和數組,因為這種做法無視了單向資料綁定,且可能會導致意料之外的結果。

Vue3 Props 文件

正確的修改方法是觸發子元件事件,父元件監聽該事件並執行修改父元件的函數,以v-model 為例,v-model 本身就是傳遞給子元件的modelValue 屬性,然後監聽update:modelValue 事件來做到雙向資料綁定,所以我們也可以透過這個方法來在程式碼中修改modelValue

this.$emit("update:modelValue", !this.$props.modelValue);
登入後複製

v-model 將自動監聽update:modelValue 事件並將modelValue 修改為觸發事件時傳遞的參數值(即$emit 的第二個參數)。

要注意的是,這種透過觸發事件-監聽事件的資料流模式並不能馬上生效,如果使用以下程式碼

this.$emit("update:modelValue", !this.$props.modelValue);console.log(this.$props.modelValue);
登入後複製

會發現輸出到控制台的仍然是modelValue 原先的值,這是因為觸發事件-監聽事件的模式下屬性值的修改需要時間,改用以下程式碼會發現輸出正常:

this.$emit("update:modelValue", !this.$props.modelValue);setTimeout(()=> {console.log(this.$props.modelValue)}, 1000)
登入後複製

實作

由於Vant 只實作了左邊放label 的輸入框,想基於此實作一個label 在右邊的輸入框

##Vant3 Field 文件

#這其中遇到的問題除了把

label 右置並根據label 的內容自適應寬度外,就是Vant 中的 與我需要實現的 以及放置 的父元件之間的資料流了。

錯誤做法

為了能夠與

一致使用v-model ,我在< right-label-input /> 下方設定modelValue 屬性,然後將v-model="modelValue"

<template>
<van-field :placeholder="placeholder" :name="name" v-model="modelValue" :disabled="disabled"/>
</template>

<script>
export default {
    name: "RightLabelInput",
    props: {
        modelValue: "",
    },
}
</script>
登入後複製
無疑,這種做法違反了單向資料流原則,在

VanField 修改時將直接影響RightLabelInputmodelValue 值,而modelValueRightLabelInput 的屬性,不能直接修改。

可能正確的做法

<template>
    <van-field :placeholder="placeholder"
               :name="name"
               v-model="input"

               :disabled="disabled"
    />
</template>

<script>
export default {
    name: "RightLabelInput",
    props: {
        placeholder: "",
        name: "",
        label: "",
        modelValue: "",
        disabled: {
            type: Boolean,
            default: false
        }
    },
    data() {
        return {
            input: this.modelValue, // 绑定到 data 的变量,防止直接修改 Props
        }
    },
    beforeMount() {
        this.input = this.modelValue
    },
    watch: {
        input(newInput, oldInput) {
            this.$emit("update:modelValue", newInput); // 监听 input 在修改时发起事件,由父组件修改 modelValue 的值
        },
        modelValue(newValue, oldValue) {
            this.input = newValue;
        }
    }
}
</script>

<style scoped>

</style>
登入後複製

關鍵字:單向資料流

【相關推薦:《

vue.js教學》】

以上是vue可以修改prop中的值嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

React與Vue:Netflix使用哪個框架? React與Vue:Netflix使用哪個框架? Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

See all articles