一.Vue组件开发中插槽
1.1 插槽的作用
插槽的作用是为了拓展组件的灵活性,因为我们定义组件时,组件中的内容基本被固定,所以在组件中预备插槽时可以拓展组件的功能,在引用组件时可以修改组件内容的显示
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>父子组件访问</title>
<script src="./vue.js"></script>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<span>root组件中的内容</span>
<component1>
<div>
<span>这是插槽的内容111</span>
</div>
</component1>
<component1>
<div>
<span>这是插槽的内容2222</span>
</div>
</component1>
</div>
<template id="content">
<div>
<slot></slot>
</div>
</template>
<script>
const vm = new Vue({
el:"#app",
data:{
message: 'hello',
},
methods:{
},
components:{
component1:{
template: '#content',
data(){
return {name: 'Jack'}
},
methods:{
btnclick(){
console.log("打印component1组件中的showMessage函数");
}
},
}
}
})
</script>
</body>
</html>
1.2 具名插槽
具名插槽就是带名称的插槽,就是为了修改指定插槽中值的内容
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>父子组件访问</title>
<script src="./vue.js"></script>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<span>root组件中的内容</span>
<component1>
<div slot='left'>
<span>这是插槽的内容left</span>
</div>
<div slot='center'>
<span>这是插槽的内容left</span>
</div>
</component1>
</div>
<template id="content">
<div>
<slot name="left"></slot>
<slot name="center"></slot>
<slot name="right"><span>default</span></slot>
</div>
</template>
<script>
const vm = new Vue({
el:"#app",
data:{
message: 'hello',
},
methods:{
},
components:{
component1:{
template: '#content',
data(){
return {name: 'Jack'}
},
methods:{
btnclick(){
console.log("打印component1组件中的showMessage函数");
}
},
}
}
})
</script>
</body>
</html>
通过name来为插槽定义名称,然后在组件使用处使用slot=‘name’来为指定插槽进行替换
1.3 作用域插槽
作用域插槽的实质指的时,父组件中对插槽进行替换,但是渲染的数据来自子插槽
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>父子组件访问</title>
<script src="./vue.js"></script>
<style>
[v-cloak] {
display: none;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<span>root组件中的内容</span>
<component1>
<template slot-scope="slot">
<div>
<span v-for="item in slot.data">{{ item }} * </span>
<br>
<span>{{ slot.data.join(' - ') }}</span>
</div>
</template>
</component1>
</div>
<template id="content">
<div>
<slot :data='PLanguage'></slot>
</div>
</template>
<script>
const vm = new Vue({
el:"#app",
data:{
message: 'hello',
},
methods:{
},
components:{
component1:{
template: '#content',
data(){
return {PLanguage: ['javascript', 'java', 'python', 'script']}
},
methods:{
btnclick(){
console.log("打印component1组件中的showMessage函数");
}
},
}
}
})
</script>
</body>
</html>
root组件中的内容
{{ item }} *
{{ slot.data.join(' - ') }}
{{ slot.data.join(' - ') }}
</template>
</component1>
</div>
<template id="content">
<div>
<slot :data='PLanguage'></slot>
</div>
</template>
<script>
const vm = new Vue({
el:"#app",
data:{
message: 'hello',
},
methods:{
},
components:{
component1:{
template: '#content',
data(){
return {PLanguage: ['javascript', 'java', 'python', 'script']}
},
methods:{
btnclick(){
console.log("打印component1组件中的showMessage函数");
}
},
}
}
})
</script>
</body>