Vue中jsx不完全应用指南小结

2020-06-12 21:06:52易采站长站整理


<template>
<div>
<slot v-bind:injectedProps="slotProps">
{{ user.lastName }}
</slot>
</div>
</template>

<script>
export default {
data() {
return {
user: {
firstName: 'snow',
lastName: 'wolf'
}
}
},

computed: {
slotProps() {
return {
user: this.user,
logFullName: this.logFullName
}
}
},

methods: {
logFullName() {
console.log(`${this.firstName} ${this.lastName}`)
}
}
}
</script>

在父组件中使用:


<current-user>
<template v-slot:default="{ injectedProps }">
<div>{{ injectedProps.user.firstName }}</div>
<el-button @click="injectedProps.logFullName">Log Full Name</el-button>
</template>
</current-user>

在上面的代码中我们实际上使用解构的方式来取得injectedProps,基于解构的特性还可以重命名属性名,在prop为undefined的时候指定初始值。


<current-user v-slot="{ user = { firstName: 'Guest' } }">
{{ user.firstName }}
</current-user>

如果组件只有一个默认的插槽还可以使用缩写语法,将v-slot:default=”slotProps”写成v-slot=”slotProps”,命名插槽写成v-slot:user=”slotProps”,如果想要动态插槽名还可以写成v-slot:[dynamicSlotName],此外具名插槽同样也有缩写语法,例如 v-slot:header可以被重写为#header

上面介绍了很多插槽相关的知识点足已说明其在开发过程中的重要性。说了很多在模板中如何定义和使用作用域插槽,现在进入正题如何在jsx中同样使用呢?


// current-user components
{
data() {
return {
user: {
firstName: 'snow',
lastName: 'wolf'
}
}
},

computed: {
slotProps() {
return {
user: this.user,
logFullName: this.logFullName
}
}
},

methods: {
logFullName() {
console.log(`${this.firstName} ${this.lastName}`)
}
},

render() {
return (
<div>
{this.$scopedSlots.subTitle({
injectedProps: this.slotProps
})}
</div>
)
}
}

然后在父组件中以jsx使用:


<current-user {...{
scopedSlots: {
subTitle: ({ injectedProps }) => (
<div>
<h3>injectedProps.user</h3>
<el-button onClick={injectedProps.logFullName}>Log Full Name</el-button>
</div>
)
}
}}></current-user>