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 相关文章推荐
一种JavaScript的设计模式
Nov 22 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
javascript整除实现代码
Nov 23 Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
用jQuery获取table中行id和td值的实现代码
May 19 Javascript
关于Iframe父页面与子页面之间的相互调用
Nov 22 Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 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
Oracle 常见问题解答
2006/10/09 PHP
基于initPHP的框架介绍
2013/04/18 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
3.12植树节活动总结2014
2014/03/13 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
名人传读书笔记
2015/06/26 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS