Vue表單類的父子組件數據傳遞示例_vue.js_腳本之家

使用Vue.js進行項目開發,那必然會使用基于組件的開發方式,這種方式的確給開發和維護帶來的一定的便利性,但如果涉及到組件之間的數據與狀態傳遞交互,就是一件麻煩事了,特別是面對有一大堆表單的頁面。

在這里記錄一下我平時常用的處理方式,這篇文章主要記錄父子組件間的數據傳遞,非父子組件主要通過Vuex處理,這篇文章暫時不作說明。

與文檔里給的方案一樣,父組件向子組件傳遞數據主要通過 props,子組件向父組件傳遞數據主要通過觸發器 $emit(),只是在用法上會有些不同。

1、傳遞基本類型數據

當子組件內容較少時,會直接傳遞基本類型數據,通常為String, Number, Boolean三種。

先看個例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<!-- 父組件 parent.vue -->

?

<template>

??<div class="parent">

????<h3>問卷調查</h3>

????<child v-model="form.name"></child>

????<div class="">

??????<p>姓名:{{form.name}}</p>

????</div>

??</div>

</template>

?

<script>

??import child from './child.vue'

?

??export default {

????components: {

??????child

????},

????data () {

??????return {

????????form: {

??????????name: '請輸入姓名'

????????}

??????}

????}

??}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<!-- 子組件 child.vue -->

?

<template>

??<div class="child">

????<label>

??????姓名:<input type="text" :value="currentValue" @input="changeName">

????</label>

??</div>

</template>

?

<script>

??export default {

????props: {

??????// 這個 prop 屬性必須是 valule,因為 v-model 展開所 v-bind 的就是 value

??????value: ''

????},

????methods: {

??????changeName (e) {

????????// 給input元素的 input 事件綁定一個方法 changeName

????????// 每次執行這個方法的時候都會觸發自定義事件 input,并且把輸入框的值傳遞進去。

????????this.$emit('input', e.target.value)

??????}

????}

??}

</script>

給子組件的 input 事件綁定一個方法 changeName,每次執行這個方法的時候都會觸發自定義事件 input,并且把輸入框的值傳遞進去。

父組件通過 v-model 指令綁定一個值,來接收子組件傳遞過來的數據。但這樣只是父組件響應子組件的數據,如果還要子組件響應父組件傳遞的數據,就需要給子組件定義一個props屬性 value,并且這個屬性必須是 value,不能寫個其它單詞。

v-model 其實就是一個語法糖,詳情可以參考使用自定義事件的表單輸入組件。

2、傳遞引用類型數據

當子組件里的內容比較多時,比如子組件有多個表單元素,如果還像上面那樣給每個表單元素綁定值,那就要寫很多重復代碼了。所以這個時候通常傳遞的是一個對象,傳值的基本原理不變,不過寫法上會有些不同。

還是先看代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<!-- 父組件 parent.vue -->

?

<template>

??<div class="parent">

????<h3>問卷調查</h3>

????<child :formData.sync="form"></child>

????<div class="">

??????<p>姓名:{{form.name}}</p>

????</div>

??</div>

</template>

?

<script>

??import child from './child.vue'

?

??export default {

????components: {

??????child

????},

????data () {

??????return {

????????form: {

??????????name: '請輸入姓名',

??????????age: '21'

????????}

??????}

????}

??}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<!-- 子組件 child.vue -->

?

<template>

??<div class="child">

????<label>

??????姓名:<input type="text" v-model="form.name">

????</label>

????<label>

??????年齡:<input type="text" v-model="form.age">

????</label>

????<label>

??????地點:<input type="text" v-model="form.address">

????</label>

??</div>

</template>

?

<script>

??export default {

????data () {

??????return {

????????form: {

??????????name: '',

??????????age: '',

??????????address: ''

????????}

??????}

????},

????props: {

??????// 這個 prop 屬性接收父組件傳遞進來的值

??????formData: Object

????},

????watch: {

??????// 因為不能直接修改 props 里的屬性,所以不能直接把 formData 通過v-model進行綁定

??????// 在這里我們需要監聽 formData,當它發生變化時,立即將值賦給 data 里的 form

??????formData: {

????????immediate: true,

????????handler (val) {

??????????this.form = val

????????}

??????}

????},

????mounted () {

??????// props 是單向數據流,通過觸發 update 事件綁定 formData,

??????// 將 data 里的 form 指向父組件通過 formData 綁定的那個對象

??????// 父組件在綁定 formData 的時候,需要加上 .sync

??????this.$emit('update:formData', this.form)

????}

??}

</script>

props 是單向數據流,當我們需要對 props 內的屬性進行雙向綁定時,就需要用到.sync 修飾符,詳情請參考.sync 修飾符,這里不做贅述。

這里需要注意的是,vue 中是不能直接修改 props 的,所以如果我們要向父組件傳值,還是需要通過修改 data 里的值,prop 只是作為父子之間通話的中間人存在。

另外,如果我們想要預覽父組件最開始傳的數據,就需要通過 watch 監聽 prop 的變化,在子組件初始化的時候就把值傳進去。

注意:?我在子組件里把 this.$emit('update:formData', this.form) 放在 mounted 當中的,其原因是為了避免在每個 input 標簽的 input 事件中觸發自定義事件,但這樣寫的前提是,父子組件都要共用一個對象。

這也就是上面代碼中,父組件中使用 :formData.sync="form" 綁定值時,form 是一個對象,而子組件中的觸發自定義事件 this.$emit('update:formData', this.form) ,this.form 也得是一個對象。

這里還需要注意的是,如果有多個子組件使用一個對象,那就要避免這種寫法,因為一個組件修改了這個對象的數據,那么其它子組件也就都跟著改變了。

所以我在用的時候都是給每個子組件分配了一個自己的對象,比如:

1

2

3

4

5

6

7

8

data () {

?return {

??parentObject: {

???child_1_obj: {},

???child_2_obj: {},

??}

?}

}

這是在父組件里定義的數據,當然名字不會這樣取了。

結尾

也沒什么說的了,對 Vue 還是處于使用的階段,對其底層的東西了解還不夠,我也好想讀讀源碼,但總只是想想.....大家覺得有什么不妥的地方盡管說,大家相互交流交流。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248869.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jmeter-【JSON Extractor】-響應結果中三級key取值

一、請求返回樣式 二、取第三個option 三、查看結果 轉載于:https://www.cnblogs.com/Nancy-Lee/p/10938758.html

Day5:python之函數(3)

一、函數默認值參數 內置函數&#xff1a; input&#xff08;&#xff09;、print&#xff08;&#xff09;、int&#xff08;&#xff09; 常用模塊&#xff1a; 1、列表生成式 s [1,2,3,4,5,6,7,8] for i in s:print(i1) res [ i1 for i in s] res [str(i) for i in s]prin…

vue路由傳參的三種基本方式 - 流年的櫻花逝 - SegmentFault 思否

現有如下場景&#xff0c;點擊父組件的li元素跳轉到子組件中&#xff0c;并攜帶參數&#xff0c;便于子組件獲取數據。 父組件中&#xff1a; <li v-for"article in articles" click"getDescribe(article.id)"> methods&#xff1a; 方案一&#…

Rust從入門到放棄(1)—— hello,world

安裝及環境配置 特點&#xff1a;安全&#xff0c;性能&#xff0c;并發rust源配置RLS安裝cargo rust管理工具&#xff0c;該工具可以愉快方便的管理rust工程 #!/bin/bash mkdir learn cd learn cargo init ## 該命令會在當前目錄下初始化一個## 目錄下會出現一個Cargo.toml文…

牛客33-tokitsukaze and Number Game(數論)

題目描述 tokitsukaze又在玩3ds上的小游戲了&#xff0c;現在她遇到了難關。 tokitsukaze得到了一個整數x&#xff0c;并被要求使用x的每一位上的數字重新排列&#xff0c;組成一個能被8整除的數&#xff0c;并且這個數盡可能大。 聰明的你們請幫幫可愛的tokitsukaze&#xff0…

手摸手,帶你用vue擼后臺 系列一(基礎篇) - 掘金

完整項目地址&#xff1a;vue-element-admin 系列文章&#xff1a; 手摸手&#xff0c;帶你用 vue 擼后臺 系列一&#xff08;基礎篇&#xff09;手摸手&#xff0c;帶你用 vue 擼后臺 系列二(登錄權限篇)手摸手&#xff0c;帶你用 vue 擼后臺 系列三 (實戰篇)手摸手&#xf…

21、python基礎學習-new_three_menu

1 #!/usr/bin/env python2 #__author: hlc3 #date: 2019/5/294 5 menu {6 北京: {7 海淀: {8 五道口: {9 soho: {}, 10 網易: {}, 11 google: {} 12 }, 13 中關村: { 14 …

文獻筆記(十六)

一、基本信息 標題&#xff1a;一種基于 C 語言訪問 MySQL 數據庫的研究 時間&#xff1a;2016 出版源&#xff1a;貴州輕工職業技術學院 領域分類&#xff1a;數據庫與信息管理 作者&#xff1a;唐林 副教授&#xff0c; 研究方向&#xff1a; 計算機應用 二、研究背景 相關工…

webpack+vue+mui學習心得

引入mui 1.不需要npm安裝; 直接從官方下載丟進來 2.那就是全局引用了; 沒錯,就是index.html里直接引入,當然也可以main.js引入,隨意啦! so easy 3.找到webpack.base.conf.js,在module與plugins之間插入以下代碼: 4.這樣就可以在項目里面直接用了.然就是mui與vue-router及點…

[java設計模式簡記] 觀察者模式(Observer-Pattern)

觀察者模式(Observer-Pattern) 數據主體擁有需要數據的對象的數據&#xff0c;并且數據改變時需要數據的對象要及時知道 意圖&#xff1a; 定義對象間的一種一對多的依賴關系&#xff0c;當一個對象的狀態發生改變時&#xff0c;所有依賴于它的對象都得到通知并被自動更新。主要…

【ARTS】01_04_左耳聽風-20181203~1209

ARTS&#xff1a; Algrothm: leetcode算法題目Review: 閱讀并且點評一篇英文技術文章Tip/Techni: 學習一個技術技巧Share: 分享一篇有觀點和思考的技術文章Algorithm Single Number https://leetcode.com/problems/single-number/ 1&#xff09;problem Given a non-empty arra…

vue項目(webpack+mintui),使用hbuilder打包app - 小小人兒大大夢想 - 博客園

一、配置config/index.js 本人沒有配置index.js文件&#xff0c;就開始進行了打包&#xff0c;結果最終效果是頁面空白&#xff0c;解決了空白&#xff0c;接著底部圖標&#xff08;我是用的阿里巴巴圖片&#xff09;資源找不到。所以配置這步比較重要。 &#xff08;1&#…

caffe介紹

轉載于:https://www.cnblogs.com/Artimis-fightting/p/10945099.html

python-mysql 基礎知識記錄

cursor.fetchone() 與 cursor.fetchall() 如果查詢結果為空&#xff0c;前者返回 None&#xff0c;后者返回[] 此時如用 len() 函數計算長度&#xff0c;前者報錯&#xff0c;后者返回0 轉載于:https://www.cnblogs.com/ZuoAn-xieyang/p/10097230.html

微服務之consul(一) - 詩碼者 - 博客園

一、概述 consul是google開源的一個使用go語言開發的服務發現、配置管理中心服務。內置了服務注冊與發現框 架、分布一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案&#xff0c;不再需要依賴其他工具&#xff08;比如ZooKeeper等&#xff09;。服務部署簡單&#x…

C#動態加載dll,dll目錄指定

<?xml version"1.0"?><configuration><startup> <supportedRuntime version"v4.0" sku".NETFramework,Versionv4.0"/></startup> <runtime> <assemblyBinding xmlns"urn:schemas-microsoft-com:a…

RestFramework之認證組件

一、認證組件的介紹 對于認證&#xff0c;我們一般有三種方式&#xff0c;即cookie, session,token, cookie,是將信息存放在客戶端(瀏覽器上)&#xff0c;信息不安全&#xff1b;session,把信息放在服務器數據庫中&#xff0c;但是要是信息量較大&#xff0c;對服務器的壓力就會…

圖解基于 Node.js 實現前后端分離 - CSDN博客

因為會上出了個意外&#xff0c;ppt圖片全部丟失&#xff0c;只好對著白板跟大家交流了半個多小時。由于我做演講不喜歡寫太多的文字&#xff0c;沒有圖片的情況下講漏了一些內容。這篇文章是我在會上分享內容對照ppt進行地整理。 基本介紹 首先從一個重要的概念“模板”說起…

java基礎之XML

目錄 java基礎之XML1. XML解析概述2. DOM4J介紹2.1 常用包2.2 內置元素2.2 Element類2.3 Attribute類2.4 常用操作3. 代碼演示3.1 DOM4J讀取xml文件3.2 DOM4J創建xml文件3.2 DOM4J修改xml文件java基礎之XML XML是一種通用的數據交換格式,它的平臺無關性、語言無關性、系統無關性…

CF176E Archaeology(set用法提示)

題目大意&#xff1a; 給一棵樹&#xff0c;每次激活或熄滅一個點&#xff0c;每次問這些點都聯通起來所需的最小總邊權 分析&#xff1a; 若根據dfs序給所有點排序&#xff0c;為$v1,v2,v3....vk$&#xff0c;那么答案就是$(dis(v1,v2)dis(v2,v3)...dis(vk-1,vk)dis(vk,v1))/2…