Vue.js子組件向父組件通訊

1、場景描述:

曾經有個電商項目,其中有個「老帶新」模塊,並且該模塊新增的入口不少,可是新增後展現效果還不同,當時就考慮將新增的組件單獨拿出來,其實就是一個子組件向父組同步數據的過程。
vue

固然,背景不重要了,關鍵是看實現的方式。
vue-cli

2、場景展現效果

(PS:展現效果請忽略美感)bash

3、如何實現

注意:Vuejs架構經過vue-cli 3.X搭建的項目,版本無所謂。
架構

一、先看下目錄體系,下圖子組件放在components文件夾內,模擬子組件爲itemAdd.vue,父組件視圖放在views文件夾內,模擬父組件名稱爲Home.vue。ui


二、效果圖裏面能夠看出有兩個三個元素:輸入框、單選框、和新增按鈕。this

  • 輸入框使用v-model綁定值,方便後邊獲取到輸入框數值;
  • 單選框一樣使用v-model綁定值,在新增時,將picked的值同步至父組件;
  • 新增按鈕,新增時將表單元素的組件值,操做傳遞事件;

子組件元素代碼:
spa

<template>
    <div class='add_item'>
        <label for="username">用戶名:
            <input id='username' v-model='username' type="text" name='name'>
        </label>
        <br />
        <input type="radio" value='男' id='male' v-model='picked'>
        <label for="male">男</label>
        <input type="radio" value='女' id='female' v-model='picked'>
        <label for="female">女</label>
        <br />
        <button @click='add_user'>新增</button>
    </div>
</template>複製代碼

子組件數據、事件均放在script裏面:
code

<script>
export default {
    name: "itemadd",
    data() {
        return {
            username: "",
            picked: '男'
        }
    },
    methods: {
        add_user() {
        	let user={username:this.username,sex:this.picked}
        	this.$emit('adduser',user)
        }
    }
}
</script>複製代碼

順便貼下子組件的樣式
component

<style>
.add_item {
    width: 100%;
    background-color: lightblue;
    padding-top: 10px;
    padding-bottom: 10px;
}

.add_item button {
    outline: none;
    border: none;
    width: 200px;
    height: 40px;
    color: white;
    background-color: green;
    border-radius: 10px;
}
</style>複製代碼

三、父組件在使用子組件時,先獲取到子組件,一併在代碼裏面展現組件事件cdn

父組件的script內,獲取子組件、初始列表數據、以及組件數據傳遞方法,代碼有簡單說明

<script>
// 獲取組件
import itemAdd from '@/components/itemAdd.vue'

export default {
    name: 'home',
    data() {
        return {
            // 設置初始列表值,爲展現效果,特地初始一條數據
            userList: [{
                username: "yang",
                sex: "男"
            }]
        }
    },
    methods: {
        //調用子組件時添加數據到父組件數據
        newuser(user) {
            this.userList.push(user)
        }
    },
    //子組件調用
    components: {
        itemAdd
    }
}
</script>複製代碼

父組件經過v-on,添加事件方法

<template>
    <div class="home">
    	<!-- 子組件調用,並添加時間方法 -->
        <item-add @adduser='newuser'></item-add>
        <ul>
        	<!-- 簡單的樣式展現 -->
            <li>
                <span>用戶名</span>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <span>性別</span>
            </li>
            <li v-for='user in userList' :key='user.id'>
                <span>{{user.username}}</span>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <span>{{user.sex}}</span>
            </li>
        </ul>
    </div>
</template>複製代碼

按照流程,隨便貼下父組件樣式

<style scoped>
li {
    list-style: none;
}

li:nth-child(even) {
    background-color: lightgrey;
}
</style>複製代碼

4、總結:

子組件經過事件向父組件同部數據,上文展現的是經過$emit事件。其實還有v-model、Vuex等方式進行傳遞數據。

第一次寫技術文章,語言表達上還有欠缺,請技術大神們多指點。

相關文章
相關標籤/搜索