VueDay13组件传值

一、组件是可复用的 Vue 实例,组件和父元素之间如何传值?父元素又如何传值给子元素?

首先,一个基本的组件运用代码如下所示:(通过Vue.component对组件命名并设置template模板运用)

Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

  

二、问:父元素如何传值给子元素?

       答:通过Prop向子元素传递数据。代码如下:

1)

<!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>
				<!-- 从父组件传值到子组件 -->
				<product-com v-for="item,index in proList" :product="item"></product-com>
			</ul>
		</div>
		<script type="text/javascript">
			// 产品组件
			Vue.component("product-com",{
				props:['product'],
				// 反引号可以换行写标签名
				template:`<li>
					<h3>产品名称:{{product.title}}</h3>
					<h4>产品描述:{{product.brief}}</h4>
					<p>产品价格:{{product.price}}</p>
				</li>`,
				data:function(){
					return{
						title:"三只松鼠"
					}
				}
			})
			// 根组件
			let app = new Vue({
				el:"#app",
				data:{
					proList:[
						{
							title:"产品1",
							price:"10",
							brief:"产品描述1"
						},
						{
							title:"产品2",
							price:"20",
							brief:"产品描述2"
						},
						{
							title:"产品3",
							price:"30",
							brief:"产品描述3"
						},
						{
							title:"产品4",
							price:"40",
							brief:"产品描述4"
						}
					]
				}
			})
		</script>
	</body>
</html>

  

2)一个简单的父元素传值子元素代码:

<!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>
				<!-- 从父组件传值到子组件 -->
				<!-- 静态属性 -->
				<school school-name="清华北大"></school>
				<!-- 动态属性 -->
				<school :school-name="'上海浙大'"></school>
				<!-- 动态属性 -->
				<school :school-name="schoolList[0]"></school>
				<!-- 循环传值组件 -->
				<school v-for="item,index in schoolList" :key="index" :index="index" :school-name="item"></school>
				
			</ul>
		</div>
		<script type="text/javascript">
			// 产品组件
			Vue.component("school",{
				// props告知是父元素传过来的值
				props:['schoolName','index'],
				// 反引号可以换行写标签名
				template:`<li>
					<h3>{{index+1}}-学校名称:{{schoolName}}</h3>
				</li>`
			})
			// 根组件
			let app = new Vue({
				el:"#app",
				data:{
					schoolList:['sxt','czbk','xmg']
				}
			})
		</script>
	</body>
</html>

  

三、问:子元素如何传递数据给父元素?

       答:子组件可以通过调用内建的 $emit方法传入事件名称来触发一个事件。代码如下:

          1.点击“选择学校”按钮会触发chooseEvent(schoolName)方法。

        2.在子组件中设置chooseEvent(schoolName)方法,方法里面调用内建的$emit方法传入父元素标签触发的方法名称以及要传递的schoolName参数值。

        3.使用$emit方法找到父元素对应标签触发的事件名称,从而对父元素中的methods方法事件changeEvent()进行触发,将传过来的data数据值拿到并展示。

<!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>
				<!-- 从父组件传值到子组件 -->
				<!-- 循环传值组件 -->
				<school v-for="item,index in schoolList" @cschool='changeEvent' :key="index" :index="index" :school-name="item"></school>
				
			</ul>
			<h2>选中的学校是:{{chooseSchool}}</h2>
		</div>
		<script type="text/javascript">
			// 产品组件
			Vue.component("school",{
				// props告知是父元素传过来的值
				props:['schoolName','index'],
				// 反引号可以换行写标签名
				// 同时子组件可以通过调用内建的 $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)
					}
				}
			})
			// 根组件
			let app = new Vue({
				el:"#app",
				data:{
					schoolList:['清华','北大','浙大','中大'],
					chooseSchool:""
				},
				methods:{
					changeEvent:function(data){
						console.log("触发学校选择事件")
						this.chooseSchool = data
					}
				}
			})
		</script>
	</body>
</html>

  

 

posted @ 2020-10-06 00:24  peifengyang  阅读(145)  评论(0编辑  收藏  举报