1. 程式人生 > >Vue入門-父元件向子傳值與子元件呼叫父元件中的方法

Vue入門-父元件向子傳值與子元件呼叫父元件中的方法

Vuex是什麼?

一般用於中大型專案,管理元件中的傳值方式,相當於angular中的全域性服務,裡面有store宣告的屬性可以共享,每個元件都可以繫結。想要改變值,可以向store提交一個突變,方法便會執行一次。

父向子傳值

1、child子元件對desc屬性繫結的是sString,而sString的值是高漸離,故結果為: 顯示父級傳過來的值:高漸離。

注意:子元件要接收父元件傳進來的值,那麼一定要放在props中.在props中宣告對應的屬性(舉例:desc),並進行屬性繫結,繫結對應的變數(舉例:sString)。

2、child子元件對students屬性繫結的是oStudent,而oStudent的job屬性為”殺手”,故輸出的結果為”2、(父向子傳值-物件方式)接收到父級傳過來的值:殺手”。

3、對input標籤進行雙向繫結到sValue,sValue已經在父元件中宣告.對szval進行監聽,當其值改變的時候,在輸入框輸入內容時,對應的函式console.log(newValue);執行,控制檯輸出改變後的值.而在元件中的鉤子函式created中,計時器改變其值為”李斯”。

子元件呼叫父元件的方法

子元件中的button按鈕繫結點選事件useParent(),該useParent()方法在子元件的methods中宣告,

在該方法中通過this.$parent.doParent(this.desc)呼叫父元件這個中的doParent()方法[功能console.log('父級中的方法',msg);],

而傳入的引數desc綁定了sString,child子元件對desc屬性繫結的是sString,而sString,的值是高漸離,因此:最終輸出的結果為”父級中的方法 高漸離”。

程式碼示例(參考上面的分析理解程式碼)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>父向子通訊</title>
    <style type="text/css">
        #app {
            border: slateblue 1px solid;
            width: 480px;
            margin: auto;
            padding: 20px;
            border-radius: 5px;
            background: #f2f2f2;
        }

        #wrapper {
            border: 1px solid red;
            width: 450px;
            margin: auto;
            padding: 10px;
            border-radius: 5px;
            background: #f9f9f9;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>

<body>
    <div id="app">
        <h1>該部分為父元件</h1>
        <h2>姓名:{{sString}}</h2>
        <!-- 動態繫結 -->
        <input type="text" v-model="sValue">
        <!--v-bind:等價於:-->
        <p>顯示父級傳入的值:{{oStudent.name}}</p>
        <!-- 注意:desc,students,hou均為子元件中props中宣告的屬性;sString,oStudent,sValue均為父元件中宣告的變數 -->
        <child :desc="sString" :students="oStudent" :hou="sValue"></child>
    </div>
</body>

</html>
<template id="child">
    <div id="wrapper">
        <h1>該部分為子元件</h1>
        <!-- 注意:desc,students,hou均為子元件中props中宣告的屬性 -->
        <p>1、顯示父級傳過來的值:{{desc}}</p>
        <p>2、(父向子傳值-物件方式)接收到父級傳過來的值:{{students.job}}</p>
        <p>3、顯示父級中input標籤動態輸入的內容:{{hou}}</p>
        <button @click="useParent">4、子元件呼叫父級中的方法</button>
    </div>
</template>
<script>
    // export default {};
    let child = {
        template: '#child',
        data() {
            return {};
        },
        methods: {
            useParent() {
                // 呼叫父級元件的方法
                // $parent: 訪問父級元件的例項 $root: 訪問根例項 在本例中$parent與$root是一樣.
                this.$parent.doParent(this.desc);
            }
        },
        // 元件中的鉤子函式
        // 1.created 當前元件例項建立好,但是頁面沒有顯示
        created() {
            setInterval(() => {
                // 注意:父向子是單向資料流變化,在子元件中的變化,不會影響到父元件
                this.hou = '李斯';
                // 1.傳入的是引用,可以通過該物件改變屬性的值,會影響父級.
                // this.students.name = '蓋聶';
                // 2.傳入的是值,不會影響父級
                this.students = {
                    name: '嬴政',
                    job:'皇帝'
                };
            }, 5000);
        },
        // 可以是陣列, 但是不嚴謹, 建議使用物件
        // 注意:父向子是單向資料流變化,在子元件中的變化,不會影響到父元件
        // 值傳遞(簡單型別)/引用傳遞(array,object)
        // 要想接收外部傳進來的值,那麼一定要放在props中
        props: {
            // 注意:寫屬性名的時候,建議不要寫成駝峰命名法.寫成駝峰命名時,在父級中呼叫需要寫成小寫-小寫的形式.
            hou: {
                type: String
            },
            desc: {
                type: String,
                // default是可選的
                default: '自己設定的預設值',
                required: true
            },
            students: {
                type: Object,
                // 設定物件的預設值,需要使用工廠函式,返回預設值。
                default: function () {
                    return {
                        name: '韓非',
                        age: 20
                    };
                }

            }

        }
    };

    new Vue({
        el: '#app',
        components: {
            child
        },
        data: {
            sString: '高漸離',
            oStudent: {
                name: '衛莊',
                job:'殺手'
            },
            sValue: ''
            
        },
        watch: {
            sValue: function (newValue, oldValue) {
                console.log(newValue);
            }
        },
        methods: {
            doParent(msg) {
                console.log('父級中的方法', msg);
            }
        }
    });
</script>

效果圖