1. 程式人生 > 實用技巧 >VueDay14子元素通過$parent或者$root傳值父元素

VueDay14子元素通過$parent或者$root傳值父元素

從父元件傳值到子元件
因為父元素的方法可以直接修改父元素的資料,所以將父元素的方法傳遞給子元素,然後子元素進行呼叫,從而修改父元素的資料
$root,$parent,$children

1.子元素通過$parent方法修改父元素的內容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <ul>
                <!-- 從父元件傳值到子元件 -->
                <!-- 迴圈傳值元件 -->
				<!-- 因為父元素的方法可以直接修改父元素的資料
				     所以將父元素的方法傳遞給子元素,
					 然後子元素進行呼叫,從而修改父元素的資料
			    -->
				<!-- :action='changeEvent' -->
                <school v-for="item,index in schoolList"  :key="index"  :index="index" :school-name="item"></school>
                 
            </ul>
            <h2>選中的學校是:{{chooseSchool}}</h2>
        </div>
        <script type="text/javascript">
            // 產品元件
            Vue.component("school",{
                // props告知是父元素傳過來的值
                props:['schoolName','index','action'],
                // 反引號可以換行寫標籤名
                // 同時子元件可以通過呼叫內建的 $emit 方法並傳入事件名稱來觸發一個事件
                template:`<li>
                    <h3>{{index+1}}-學校名稱:{{schoolName}}</h3>
                    <button @click="chooseEvent(schoolName)">選擇學校</button>
                </li>`,
                methods:{
                    chooseEvent:function(schoolName){
                        // // 將子元素的資料傳遞給父元素,需要自定義觸發事件,實現資料的傳值
                        // // this.$emit(this)
                        // // 觸發一個事件名稱叫cSchool的事件
                        // this.$emit('cschool',schoolName)
						// console.log(schoolName)
						console.log(this)
						// 元件可以通過$parent屬性找到父元素的Vue物件
						this.$parent.changeEvent(schoolName)
                    }
                }
            })
            // 根元件
            let app = new Vue({
                el:"#app",
                data:{
                    schoolList:['清華','北大','浙大','中大'],
                    chooseSchool:""
                },
                methods:{
                    changeEvent:function(data){
                        // console.log("觸發學校選擇事件")
						console.log(this)
                        this.chooseSchool = data
                    }
                }
            })
        </script>
    </body>
</html>

  

2.子元素通過$parent方法修改父元素的內容 (在檢視直接呼叫父元素方法):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <ul>
                <!-- 從父元件傳值到子元件 -->
                <!-- 迴圈傳值元件 -->
				<!-- 因為父元素的方法可以直接修改父元素的資料
				     所以將父元素的方法傳遞給子元素,
					 然後子元素進行呼叫,從而修改父元素的資料
			    -->
				<!-- :action='changeEvent' -->
                <school v-for="item,index in schoolList"  :key="index"  :index="index" :school-name="item"></school>
                 
            </ul>
            <h2>選中的學校是:{{chooseSchool}}</h2>
        </div>
        <script type="text/javascript">
            // 產品元件
            Vue.component("school",{
                // props告知是父元素傳過來的值
                props:['schoolName','index','action'],
                // 反引號可以換行寫標籤名
                // 同時子元件可以通過呼叫內建的 $emit 方法並傳入事件名稱來觸發一個事件
				
				// 在檢視直接呼叫父元素方法
                template:`<li>
                    <h3>{{index+1}}-學校名稱:{{schoolName}}</h3>
                    <button @click="$parent.changeEvent(schoolName)">選擇學校</button>
                </li>`,
                methods:{
                    chooseEvent:function(schoolName){
                        // // 將子元素的資料傳遞給父元素,需要自定義觸發事件,實現資料的傳值
                        // // this.$emit(this)
                        // // 觸發一個事件名稱叫cSchool的事件
                        // this.$emit('cschool',schoolName)
						// console.log(schoolName)
						console.log(this)
						// 元件可以通過$parent屬性找到父元素的Vue物件
						//this.$parent.changeEvent(schoolName)
                    }
                }
            })
            // 根元件
            let app = new Vue({
                el:"#app",
                data:{
                    schoolList:['清華','北大','浙大','中大'],
                    chooseSchool:""
                },
                methods:{
                    changeEvent:function(data){
                        // console.log("觸發學校選擇事件")
						console.log(this)
                        this.chooseSchool = data
                    }
                }
            })
        </script>
    </body>
</html>

  

3.$root:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <ul>
                <!-- 從父元件傳值到子元件 -->
                <!-- 迴圈傳值元件 -->
				<!-- 因為父元素的方法可以直接修改父元素的資料
				     所以將父元素的方法傳遞給子元素,
					 然後子元素進行呼叫,從而修改父元素的資料
			    -->
				<!-- :action='changeEvent' -->
                <school v-for="item,index in schoolList"  :key="index"  :index="index" :school-name="item"></school>
                 
            </ul>
            <h2>選中的學校是:{{chooseSchool}}</h2>
        </div>
        <script type="text/javascript">
            // 產品元件
            Vue.component("school",{
                // props告知是父元素傳過來的值
                props:['schoolName','index','action'],
                // 反引號可以換行寫標籤名
                // 同時子元件可以通過呼叫內建的 $emit 方法並傳入事件名稱來觸發一個事件
				
				// 在檢視直接呼叫父元素方法
                template:`<li>
                    <h3>{{index+1}}-學校名稱:{{schoolName}}</h3>
                    <button @click="$root.changeEvent(schoolName)">選擇學校</button>
                </li>`,
                methods:{
                    chooseEvent:function(schoolName){
                        // // 將子元素的資料傳遞給父元素,需要自定義觸發事件,實現資料的傳值
                        // // this.$emit(this)
                        // // 觸發一個事件名稱叫cSchool的事件
                        // this.$emit('cschool',schoolName)
						console.log(schoolName)
						console.log(this)
						// 元件可以通過$parent屬性找到父元素的Vue物件
						//this.$parent.changeEvent(schoolName)
                    }
                }
            })
            // 根元件
            let app = new Vue({
                el:"#app",
                data:{
                    schoolList:['清華','北大','浙大','中大'],
                    chooseSchool:""
                },
                methods:{
                    changeEvent:function(data){
                        // console.log("觸發學校選擇事件")
						console.log(this)
                         this.chooseSchool = data
                    }
                },
				mounted() {
					console.log(this)
				}
            })
        </script>
    </body>
</html>