视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue父子组件传值及slot应用步骤详解
2020-11-27 19:47:53 责编:小采
文档
 这次给大家带来vue父子组件传值及slot应用步骤详解,vue父子组件传值及slot应用的注意事项有哪些,下面就是实战案例,一起来看一下。

一.父子组件传值

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>父子组件传值</title>
 <style> 
 </style>
 <script src="./vue.js"></script>
</head>
<body>
 <p id="root"> 
 <counter :count="0" @numberchange="handleChange"></counter>
 <counter :count="0" @numberchange="handleChange"></counter>
 <p>{{total}}</p> 
 <validate-content content="hello world"></validate-content>
 </p>
 <script> 
 //父组件向子组件传值用 props ,加:号后传递的为js表达式,示例中则为数字,不加:号代表的是字符串 
 var counter = { //局部注册 
 props:['count'],
 data:function(){//在子组件中定义数据,data不能是对象,必须是一个函数。
 return {
 number:this.count
 }
 },
 template:'<p @click="handleClick2">{{number}}</p>',
 methods:{
 handleClick2:function(){
 this.number ++;
 //this.count++; 父组件可以传值给子组件,但子组件不可以修改父组件属性,这里这么写会报错。
 this.$emit("numberchange",this.number);//子组件向父组件传递事件,值
 }
 } 
 }
 var validateContent = {
 props:{
 //content:[Number,String] //组件参数校验,可以多选
 content:{//组件参数校验
 type:String,
 required:true,
 default:"default value",
 validator:function(value){
 return value.length > 5
 }
 }
 },
 template:'<p >{{content}}</p>',
 }
 var vm = new Vue({
 el:'#root',
 data:{
 total:0
 },
 methods:{ 
 handleChange:function(number){ 
 console.log(number)
 // this.total +=1;
 }
 },
 components:{
 counter, //局部注册要在根节点注册组件
 validateContent
 }
 })
 </script>
</body>
</html>

二.父组件向子组件传递DOM

先看一个示例

<body>
 <p id="root"> 
 <child><p>Qin</p></child>
 </p>
 <script> 
 let child = {
 template :`<p>
 <p>hello world</p> 
 </p>`
 }
 var vm = new Vue({
 el:'#root',
 components:{
 child
 } 
 })
 </script>
</body>

打开查看器查看一下

发现Qin不见了

<p>Qin</p>1

查看官方文档 , https://cn.vuejs.org/v2/guide/components-slots.html

我们得出结论:如果 child 没有包含一个 < slot > 元素,则任何传入它的内容都会被抛弃

我们加入插槽

<body>
 <p id="root"> 
 <child><p>Qin</p></child>
 </p>
 <script> 
 let child = {
 template :`<p>
 <p>hello world</p>
 <slot></slot>
 </p>` 
 }
 var vm = new Vue({
 el:'#root',
 components:{
 child
 } 
 })
 </script>
</body>

发现Qin能正常显示,且slot将会被替换为解析后的片段 < p > Qin < /p >

当父组件不向子组件传值的时候,slot还可以作为父组件默认值出现

<body>
 <p id="root"> 
 <child></child>
 </p>
 <script> 
 let child = {
 template :`<p>
 <p>hello world</p>
 <slot>default value</slot>
 </p>`
 }
 var vm = new Vue({
 el:'#root',
 components:{
 child
 } 
 })
 </script>
</body>

效果图

具名插槽

如果想使用多个插槽,我们先看看效果:

<body>
 <p id="root"> 
 <child>
 <header>This is header</header>
 <footer>This is footer</footer> 
 </child>
 </p>
 <script> 
 let child = {
 template :
 `<p> 
 <slot></slot>
 <p>Main content</p>
 <slot></slot>
 </p>`
 }
 var vm = new Vue({
 el:'#root',
 components:{
 child
 } 
 })
 </script>
</body>

发现出现了多个header和footer,要解决这个问题就要用到具名插槽

我们修改代码如下:

<body>
 <p id="root"> 
 <child>
 <header slot="header">This is header</header>
 <footer slot="footer">This is footer</footer> 
 </child>
 </p>
 <script> 
 let child = {
 template :
 `<p> 
 <slot name="header"></slot>
 <p>Main content</p>
 <slot name="footer"></slot>
 </p>`
 }
 var vm = new Vue({
 el:'#root',
 components:{
 child
 } 
 })
 </script>
</body>

可以看到显示正常了

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

JavaScript DOM元素增删改步骤详解

VeeValidate在vue项目里表单校验使用案例代码分析

下载本文
显示全文
专题