vue中父子组件注意事项,传值及slot应用技巧


Posted in Javascript onMay 09, 2018

一.父子组件传值

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>父子组件传值</title>
  <style> 
  </style>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="root"> 
    <counter :count="0" @numberchange="handleChange"></counter>
    <counter :count="0" @numberchange="handleChange"></counter>
    <div>{{total}}</div> 
    <validate-content content="hello world"></validate-content>
  </div>
  <script> 
   //父组件向子组件传值用 props ,加:号后传递的为js表达式,示例中则为数字,不加:号代表的是字符串 
   var counter = { //局部注册 
     props:['count'],
     data:function(){//在子组件中定义数据,data不能是对象,必须是一个函数。
       return {
         number:this.count
       }
     },
     template:'<div @click="handleClick2">{{number}}</div>',
     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:'<div >{{content}}</div>',
   }
   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>
  <div id="root"> 
    <child><p>Qin</p></child>
  </div>
  <script> 
   let child = {
     template :`<div>
           <p>hello world</p> 
        </div>`
   }
   var vm = new Vue({
     el:'#root',
     components:{
       child
     } 
   })
  </script>
</body>

打开查看器查看一下

vue中父子组件注意事项,传值及slot应用技巧

发现Qin不见了

<p>Qin</p>1

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

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

 我们加入插槽

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

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

vue中父子组件注意事项,传值及slot应用技巧

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

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

效果图

vue中父子组件注意事项,传值及slot应用技巧

具名插槽

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

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

vue中父子组件注意事项,传值及slot应用技巧

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

我们修改代码如下:

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

vue中父子组件注意事项,传值及slot应用技巧 

可以看到显示正常了

总结

以上所述是小编给大家介绍的vue中父子组件注意事项,传值及slot应用技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery的学习步骤
Feb 23 Javascript
Array的push与unshift方法性能比较分析
Mar 05 Javascript
将页面table内容与样式另存成excel文件的方法
Aug 05 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
Express的路由详解
Dec 10 Javascript
Angular弹出模态框的两种方式
Oct 19 Javascript
Vue中this.$router.push参数获取方法
Feb 27 Javascript
微信小程序实现运动步数排行功能(可删除)
Jul 05 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
详解Vue.directive 自定义指令
Mar 27 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
Apr 28 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 Javascript
vue中的provide/inject的学习使用
May 09 #Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 #Javascript
自定义vue组件发布到npm的方法
May 09 #Javascript
React Navigation 使用中遇到的问题小结
May 08 #Javascript
官方推荐react-navigation的具体使用详解
May 08 #Javascript
JavaScript callback回调函数用法实例分析
May 08 #Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 #Javascript
You might like
杏林同学录(六)
2006/10/09 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
php图像验证码生成代码
2017/06/08 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
bootstrap Table的一些小操作
2017/11/01 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python遍历目录的方法小结
2016/04/28 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
计算机操作自荐信
2013/12/07 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
小学家长学校培训材料
2014/08/24 职场文书
银行授权委托书格式
2014/10/10 职场文书
大学生毕业个人总结
2015/02/15 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers