3.3 组件的data和props
组件内html使用的数据,可能来自于javascript部分的data(数据)或者props(属性),这两个的异同是什么呢?
首先,data和props里面的变量都可以在template(模板)部分用双大括号引用,例如{{msg}},光看template部分是无法判断这个msg到底是props还是data
data在组件里,需要表现为一个函数,下面是一个单文件组件的data部分:
export default{ name:"Main", data(){ return{ mainInfo:{ courseName:"java程序设计", chapterName:"8.1 类的基础", percent:0.85, }, } },}
这里出现了一个mainInfo对象,然后这个对象有三个属性:courseName,chapterName和percent。它们都可以用在html模板中,例如
{{mainInfo
.courseName}}
那props是什么呢?
props是组件的参数,必须由外部传入。data是页面内部的数据,页面在运行的时候随时可以更改里面的值;props是外部给的值,它的值只能读取不能改动。它通常是这样定义的,如下所示第三行代码,这种定义方式只需要写上属性的名称,不需要指定属性的类型:
export default{ name:"Main", props:["username","courseId"], data(){ return{ mainInfo:{ courseName:"java程序设计", chapterName:"8.1 类的基础", percent:0.85, }, } },}
属性还能这样定义,username和courseId都指定了类型是String:
export default{ name:"Main", props:{ username:String, courseId:String }, data(){ return{ mainInfo:{ courseName:"java程序设计", chapterName:"8.1 类的基础", percent:0.85, }, } },}
假如这个Main组件被别的组件使用,那么就要提供username和courseId这两个属性了,类似这样:
<template> <Main :username="abcd" :courseId="1"/></template>
也就是说props的值需要使用者提供,上面的代码在什么组件,这个组件就负责提供这两个属性的值。
这里需要说明一下,:username是v-bind:的简写,这说明了abcd也是一个变量,username的值是abcd这个变量的值;如果没有冒号,username=‘abcd’,那么username这个属性值就是abcd
在组件的javascript内部,都可以使用this.这样的形式来引用data或者props里面的任何元素(但是props的值不能修改,只能读取),例如:
if(this.username != ""){
let t=response.data;
this.chapter=t;
}
如果光看着部分代码,这里的this.username,username可能是data里的元素,也可能是props里的元素。但是chapter就一定是data里的元素,因为this.chapter=t修改了chapter的值,而props的值,是不能修改的。