1. 全局组件 只要定义了,处处可以使用,性能不高,但是使用起来简单。
2. 局部组件 创建以后需要在引入的文件中 使用 components:{ } 进行注册。
父组件
const app = Vue.createApp({
template:`
JSPang.com
`
})
子组件
app.component('Son',{
props:['name'],
template:`{{name}} div `
})
父组件
const app = Vue.createApp({
data(){
return {
name: "技小胖"
}
},
template:`
JSPang.com
`
})
子组件
app.component('Son',{
props:['name'],
template:`{{name}} div `
})
子组件接收
1 String、2 Boolean、3 Array、4 Object、5 Function 和 6 Symbol。
app.component('Son', {
props: {
name: {
type: String,
validator: function (value) {
console.log(value.search("JSPang"))
return value.search("JSPang") != -1
},
default: 'JSPang.com'
}
},
template: `{{name}} div `
})
官方的解释:
所有的prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。
数据从父级组件传递给子组件,只能单向绑定。子组件内部不能直接修改从父组件传递过来的数据。
官方的解释:
其实就是子组件没有接受父组件传递过来的参数,而子组件完全不变的复制了属性到自己的标签上,就叫做Non-props属性。
5.1 inheritAttrs属性【Boolean】 是否接收Non-props属性
5.2 利用 【$attrs】来控制接收哪些参数;
app.component('Hello', {
mounted() {
console.log(this.$attrs.msg)
},
template: `
Hello World
Hello World
Hello World
`
})
6.1 子组件调用父组件事件的编写方法
6.2 子组件向父组件事件中传递参数的方法
6.3 子组件传递参数时,如何通过emits进行校验
【父组件传递】
app.component('Counter', {
data(){
return{
counter:0
}
},
methods: {
handleAddCounter(payload) {
console.log("父组件接收的参数",payload)
this.counter += 1
}
},
template: `
JSPang.com
`
})
【子组件接收】
app.component('Counter', {
props: ['counter'],
emits: ['add'], 【这里需要使用 emits,对传入的方法进行声明】
methods: {
handleClick() {
const payload = {
a:"asd"
}
this.$emit('add',payload)
}
},
})
6.4 对传递值的校验
emits: {
add: (value) => {
return value < 20 ? true : false
}
},
7.1 插槽的声明
很简单,只要在子组件中加入 solt 标签即可,然后在父组件中使用双标签进行调用。
<script>
const app = Vue.createApp({
template: `
欢迎光临红浪漫-请选择您的技师
谢大脚
`
})
app.component('JiShi', {
template: `
经过你的慎重考虑.最终选择了。
`
})
const vm = app.mount("#app")
</script>
7.2 插槽的作用域
父模板里调用的数据属性,使用的都是父模板里的数据 子模板里调用的数据属性,使用的都是子模板里的数据
7.3 具名插槽的使用【就是给标签加上一个name属性】
【父组件】
const app = Vue.createApp({
template: `
欢迎光临红浪漫-请选择您的技师
1.女宾一位,请上三楼。
3.顾客选择了全身SPA。
【具名插槽简写】【具名插槽简写】【具名插槽简写】【具名插槽简写】【具名插槽简写】
// 1.女宾一位,请上三楼。
// 3.顾客选择了全身SPA。
`
})
【子组件】
app.component('HongLangMan',{
template:`
2.你选择了大脚为你服务
`
})
<component :is="组件名称" />
为了保存input框中的文字,可以使用标签,把动态组件包裹起来。
<keep-alive>
<component :is="showItem" />
keep-alive>
这时候相当启用了缓存,把input框的值存了起来。在使用动态组件时,经常配合标签一起使用。
app.component('async-component',Vue.defineAsyncComponent(()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve({
template:`这是一个异步组件`
})
},3000)
})
}))
<script>
const app = Vue.createApp({
data(){
return {
house:'北京别墅一套',
newHouse:"北京200平方房子一套"
}
},
【1.爷爷组件定义变量】【1.爷爷组件定义变量】【1.爷爷组件定义变量】
provide:{
newHouse:"北京200平方房子一套"
},
template: `
我有一套房子,我先传给我的儿子
`
})
app.component('child',{
props:['house'],
template:`
我是子组件,我要把房子再传给我儿子。
儿子接收{{house}}
`
})
app.component('child-child',{
props:['house'],
【2.孙子组件接收变量】【2.孙子组件接收变量】【2.孙子组件接收变量】
inject:['newHouse'],
template:`
我是孙子,等待接收房子
孙子接收{{house}}
【3.孙子组件使用变量】【3.孙子组件使用变量】【3.孙子组件使用变量】
孙子接收222{{newHouse}}
`
})
const vm = app.mount("#app")
</script>
未完待续…
参考技术胖 https://jspang.com/detailed?id=69
参考 vue3.0 文档 https://v3.cn.vuejs.org/guide/component-registration.html