设为首页 加入收藏

TOP

【前端小小白的学习之路】vue学习记录⑤(组件通信-父与子)(四)
2017-10-10 12:35:51 】 浏览:10783
Tags:前端 小白 习之 vue 学习 记录 组件 通信
}
</script> <!--样式部分--> <style> .sub-container{ background: blue; color:red; } </style>

大家需要注意下子组件props的验证规则。

那么对于容易引发错误的引用类型,大家应该如何避免呢?

当我们接收过来这个对象数据后,先将其拷贝一份副本,然后用副本做增加修改等操作,这样便不会影响到父组件的数据了。

 

我们运行一下看看:

看起来验证规则生效了哈~~

那么以上都是同步的情况,那么异步呢?

假设父组件的数据是异步ajax获取的,然后渲染页面。那么此时,子组件如何跟着更新视图呢?

这就得有个监听机制。当子组件监听到父组件的数据到位后,将本地数据更新即可。

vue提供的watch可以达到此目的,我们看一下例子。

Helloworld.vue

<!--模板部分-->
<template>
 <div class="container">
  <h1>我是父亲</h1>
  <input type="text" v-model="myMsg">
<!--<input type="text" v-model="myNum">-->
  <ul v-for="item of myObj">
   <li>{{item.name}}</li>
  </ul>
 <br>
<!--绑定父组件的某个变量myMsg-->
  <div>
<!--注意子组件接受变量时,需要变为驼峰命令法sendMessage-->
   <child :send-message="myMsg" :send-num="myNum" :send-obj="myObj"></child>
  </div>

 </div>
</template>
<!--js部分-->
<script>
//引入子组件,需要设定子组件的name为child
import child from './children/child.vue'
export default {
 name:'helloworld',
 data(){
//初始化obj
  var obj = {
   myMsg:'hello,my son!',
   myNum:123,
   myObj:[]
  };
//延时返回myObj,模拟ajax的延时情况
  setTimeout(function(){
   obj['myObj'] = [{id:1,name:'jack'},{id:2,name:'tom'}];

  },2000);
  return obj;
 },
 components:{child}//局部注册子组件
}
</script>
<!--样式部分-->
<style>
.container{
 background: #ccc;
 color:green;
}
</style>

child.vue

<!--模板部分-->
<template>
 <div class="sub-container">
  <h3>我是儿子</h3>

  <div>我从父亲那边接收过来的信息:</div>
  <div>字符串:{{sendMessage}}</div>
  <div>数字:{{sendNum}}</div>
  <div>
   <ul v-for="item of list">
     <li>{{item.name}}</li>
   </ul>
  </div>

 </div>
</template>
<!--js部分-->
<script>
//子组件
export default {
 name:'child',//必须设定name,否则无法在父组件import
 props:{
  sendMessage:{
   type:String,//传入类型必须是字符串
   required:true//必传
  },
  sendNum:{
   type:Number,//传入类型必须是数字
   required:true
  },
//如果是数组或对象
  sendObj:{
   validator:function(val){

    if(Object.prototype.toString.call(val) === '[object Array]' || Object.prototype.toString.call(val) === '[object Object]'){
     return true;
    }
   }
  }
 },//声明验证类型
 data(){

   return {
    list:null
   };
 },
 watch:{//监控父组件sendObj的变化
  sendObj(newval,oldval){

   if(newval !== oldval){

    var newobj =JSON.parse(JSON.stringify(newval));//复制一份,避免污染父组件的数据
    newobj.push({id:3,name:'mike'});//追加一个对象
    this.list = newobj;//将新值赋予data的list
   }

  }
 }
}
</script>
<!--样式部分-->
<style>
.sub-container{
 background: blue;
 color:red;
}
</style>

watch的函数名称,就是要监听的值,这里我们监听父组件传来的prop;而newval和oldval参数,分别代表了新值和旧值。

在父组件未更新之前,子组件监听到的sendObj,新值和旧值都是空数组,二者是相等的;而当监听到二者发生不等时,就说明父组件传来的信息发生了改变。我们取新值,并将拷贝后的数据传给data里面的list,然后更新到视图。

看一下运行情况:

父组件与子组件的交互就实现了。

参考文章:http://mp.weixin.qq.com/s/rrKGRPTIt-aiZXijIli3ww

参考文章:http://www.cnblogs.com/ghostwu/p/7518002.

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[js高手之路] es6系列教程 - Map.. 下一篇angular之$watch方法详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目