首页 > 技术文章 > VueDay14子元素通过$parent或者$root传值父元素

peifengyang 2020-10-10 11:58 原文

 从父组件传值到子组件 
因为父元素的方法可以直接修改父元素的数据,所以将父元素的方法传递给子元素,然后子元素进行调用,从而修改父元素的数据
$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>

  

推荐阅读