1.data 声明组件初始响应式状态的函数
作用:声明初始变量 data必须使用函数返回对象的方式存储数据。因为这种方式每次调用都会返回一个新的数据对象,如果data写成对象形式,不同组件会使用同一个data(共用一个引用地址),导致数据混乱 调用:data内的数据可以直接在标签中使用 {{ }}
调用
< div id= "app" >
< div> { { userName} } < / div>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const app = Vue. createApp ( {
data ( ) {
return {
userName : '张三'
}
}
} )
app. mount ( '#app' )
< / script>
2. methods 声明要混入到组件实例中的方法
作用:声明方法 methods是一个对象,存储该组件的方法 调用: 在标签上使用 @事件='方法'
< div id= "app" >
< div @click= "fn" > { { userName} } < / div>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const app = Vue. createApp ( {
data ( ) {
return {
userName : '张三'
}
} ,
methods : {
fn ( ) {
this . userName = '李四'
}
}
} )
app. mount ( '#app' )
< / script>
3. computed 计算属性
作用:基于现有数据通过一些计算得出一个新的数据,用于到模板中使用 写法:对象形式,
key值是计算属性的名字, value值是一个对象,对象中包含一个get函数(必需)和一个set函数(选需),函数返回值作为该计算属性的值 调用:computed
内的数据可以直接在标签中使用 {{ }}
调用 特点: (1) 计算属性只读,不可修改 (2) 有缓存,get
函数默认只执行一次,返回值会缓存起来,后续多次调用同一个计算属性不会触发get
函数的多次执行,而是使用上一次执行的缓存结果 (3) 计算属性与函数的区别:计算属性有缓存,性能更优秀。 get函数: (1) 默认执行一次 (2) 需要有返回值,返回值的内容就是计算属性的值 (3) 函数内使用到数据会作为该计算属性的一个依赖项,当依赖项发生变化时,该get函数会重新执行,最终计算属性的值也会跟着变化 (4) 不能有副作用,不能写异步逻辑,不能操作DOM,不能改变外部的其他数据 6.set函数:
< div id= "app" >
< div> { { userName} } < / div>
< div> 姓:{ { cutName} } < / div>
< div @click= "cutName = '李四'" > 修改< / div>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const app = Vue. createApp ( {
data ( ) {
return {
userName : '张三'
}
} ,
computed : {
cutName : {
get ( ) {
console. log ( 1111 ) ;
return this . userName[ 0 ]
} ,
set ( value) {
this . userName = '王五'
} ,
}
}
} )
app. mount ( '#app' )
< / script>
4. watch 侦听器
作用:在状态变化时执行对应操作 写法: (1) 函数式:多用于监听变量或对象的某个属性。监听变量时,函数名要和监听的变量名相同;监听对象的某个属性时,函数名为"对象名.属性名"
。 (2) 对象式:用于监听变量或对象(也可以是对象的某个属性)。key名要和监听的对象名(变量名、"对象名.属性名"
)相同,
value值为一个对象,handler
函数(用于监听新旧数据) immediate: true
开启加载自动触发一次deep: true
开始深度监听(如果监听对象,只有开启深度监听才能监听对象内的属性值变化) handler
函数特点: (1) 有两个参数(newVal
:改变后的值, oldVal
:改变前的值) (2) 函数式无法默认触发,只有对象式中设置了immediate: true
才会开启,(函数式无法默认触发) (3) 监听对象时,无法监听深层数据的改变,如果需要深层监听,需要设置deep: true
,(函数式无法深层监听) (4) 该函数可以做异步操作、修改DOM、修改外部其他数据 (5) 该函数不需要返回值
< div id= "app" >
< div> userName:{ { userName} } < / div>
< div> name:{ { name. xing} } { { name. ming} } < / div>
< button @click= "userName = '李四'" > 修改变量userName< / button>
< button @click= "name.xing = '王'" > 修改变量userName. xing< / button>
< button @click= "name.ming = '五'" > 修改变量userName. ming< / button>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const app = Vue. createApp ( {
data ( ) {
return {
userName : '张三' ,
name : {
xing : '赵' ,
ming : '六'
}
}
} ,
watch : {
userName ( newVal, oldVal ) {
console. log ( 111 , newVal, oldVal) ;
} ,
'name.xing' ( newVal, oldVal) {
console. log ( 222 , newVal, oldVal) ;
} ,
name : {
handler ( newVal, oldVal ) {
console. log ( 333 , newVal, oldVal) ;
} ,
deep : true ,
}
}
} )
app. mount ( '#app' )
< / script>
5. components 局部注册组件
作用:局部注册子组件 写法:对象式,
key是组件名,用<组件名>调用,不能有大写字母 value是组件实例 特点:只能在当前组件使用注册的子组件
< div id= "app" >
< firstchild> < / firstchild>
< secondchilld> < / secondchilld>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const secondChilld = {
template : ` <div>全局注册</div> `
}
const app = Vue. createApp ( {
components : {
firstchild : {
template : ` <div>局部注册</div> `
}
} ,
} )
app. component ( 'secondchilld' , secondChilld)
app. mount ( '#app' )
< / script>
6. props 声明接收父组件传递的参数
作用:声明接收父组件传递的参数, 写法:
数组形式接收参数:只能声明接收的参数,不能声明参数的数据类型 对象形式接收参数:可以声明接收的参数,可以声明对传入的 props 的校验要求 特点:
父组件传递的参数只有在props中声明,才能在子组件中调用,调用方式和data相同 接收到的参数与声明的props校验要求不符时,浏览器不报错,但会警告
< div id= "app" >
< ! -- 标签上的属性会传递到子组件上 -- >
< ! -- 属性值可以是基本数据类型、引用数据类型、动态属性 ( 使用v- bin绑定一个变量) -- >
< firstchild name1= "张三" age1= "18" > < / firstchild>
< secondchild name2= "李四" age2= "20" > < / secondchild>
< / div>
< script src= "https://unpkg.com/vue@3/dist/vue.global.js" > < / script>
< script>
const app = Vue. createApp ( {
components : {
firstchild : {
template : ` <div>欢迎,{{ name1 }} - {{ age1 }}</div> ` ,
props : [ "name1" , "age1" ] ,
mounted ( ) {
console. log ( '数组形式接收props' , this . name1 + ':' + this . age1) ;
} ,
} ,
secondchild : {
template : ` <div>欢迎,{{ name2 }} - {{ age2 }}</div> ` ,
props : {
'name2' : String,
'age2' : Number
} ,
mounted ( ) {
console. log ( '对象形式接收props' , this . name2 + ':' + this . age2) ;
} ,
}
}
} ) ;
app. mount ( "#app" ) ;
< / script>
props校验
只有对象形式接收父组件参数才能声明对传入的 props 的校验要求
props : {
propA : Number,
propB : [ String, Number] ,
propC : {
type : String,
required : true
} ,
propD : {
type : Number,
default : 100
} ,
propE : {
type : Object,
default ( rawProps) {
return { message : 'hello' }
}
} ,
propF : {
validator ( value ) {
return [ 'success' , 'warning' , 'danger' ] . includes ( value)
}
} ,
propG : {
type : Function,
default ( ) {
return 'Default function'
}
}
}
7. emits