Vue2 props个人理解

92 阅读2分钟

个人理解vue2 中的props其实是组件实例的是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。父组件的数据需要通过 prop 才能下发到子组件中(摘自官网)。 也就是props是子组件访问父组件数据的唯一接口,也可以说是父组件向子组件传递某些元素属性,子组件用‘props’接收。

再理解就是:

一个组件可以直接在模板里面渲染data里面的数据(双大括号)。

子组件不能直接在模板里面渲染父元素的数据。

如果子组件想要引用父元素的数据,那么就在prop里面声明一个变量(比如a),这个变量就可以引用父元素的数据。然后在模板里渲染这个变量(前面的a),这时候渲染出来的就是父元素里面的数据。

个人感觉为什么子组件引用父组件元素的时候,不像APP组件(父组件中)那样通过import与components那样操作,假如多个组件中元素含有相同元素属性名称呢,唯一的解释点就是父组件在渲染子组件模板时,通过template指定渲染某一子组件

```js``
`<template>
	<div>
		<Student name="李四" sex="女" :age="18"/>
	</div>
</template>

<script>
	import Student from './components/Student'
	export default {
		name:'App',
		components:{Student}
	}
</script>

而在子组件中,data中根本没有定义对应的元素属性,只有通过props引用父组件的元素,并在模板中渲染展示

````<template>
	<div>
		<h1>{{msg}}</h1>
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		<h2>学生年龄:{{myAge+1}}</h2>
		<button @click="updateAge">尝试修改收到的年龄</button>
	</div>
</template>
<script>
	export default {
		name:'Student',
		data() {
			console.log(this)
			return {
				msg:'你好啊',
				myAge:this.age
			}
		},
		methods: {
			updateAge(){
				this.myAge++
			}
		},
		//接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
		props:{
			name:{
				type:String, //name的类型是字符串
				required:true, //name是必要的
			},
			age:{
				type:Number,
				default:99 //默认值
			},
			sex:{
				type:String,
				required:true
			}
		}
	}
</script>`

所以在父组件中模板渲染时直接赋值元素属性即可。 对于一些props接收到的数据修改与不可修改的问题就不多赘叙了