老莫的笔记本  
  
查看: 1146|回复: 0

VUE 父子组件传值

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2018-11-24 23:39:38 | 显示全部楼层 |阅读模式
先掰扯一下:
传值的值分为三种:  数据、方法、父组件本身
这个传值又叫 单向下行数据流   ; 传值的方式 又叫 单向下行绑定
顾名思义:就是说 我父组件可以打儿子, 儿子等着挨揍就行,儿子不能来打劳资 ; 【但是这种情况不是绝对的,比方说你考试不好劳资会生气】

好嘞,开始贴代码
先贴个 home.vue 的【就是父组件】
  1. <template>
  2.     <div id="home">
  3.         <button @click="chan"> 点击切换触发生命周期 </button>   
  4.         <!-- 头部组件引入 -->
  5.         这是home组件 <span class="lmtest">测试值是否变色</span>
  6.       
  7.         {{todata}}------{{mvc}}
  8.         <button @click="doone()">改变父组件的值 子组件的数据也会改变</button>
  9.         <br>
  10.         <button @click="dotwo()">改变子组件的值 父组件的数据也会改变</button>
  11.         <!-- 但是这是单向的, 如果在子组件中 直接改变掉 父组件通讯过去的值,父组件内的值其实不变 -->
  12.         <v-head  v-if="b" :todata="todata" :dothree="dothree" :dofour="dofour" :home="this"></v-head>
  13.         <!-- :home = "this" 表示把整个实例传递过去 -->
  14.     </div>
  15. </template>
  16. <script>
  17. // 1.引入头部组件  【组件文件尽量放在 components/ 目录中,大写首字母的.vue文件 】
  18. // 2.注册组件 【 注意如果下面components内容为ES6 语法 则html 则写成对应的标签  】
  19. // 3.引入组件 【在页面中写入<v-head></v-head> 】
  20. import Head from "./Head.vue";
  21. export default {
  22.   data() {
  23.     return {
  24.       b:false
  25.       ,todata:'这是home组件的值'
  26.       ,mvc:'溜溜留'
  27.     };
  28.   },
  29.   methods: {
  30.     chan(){
  31.       if(this.b){
  32.         this.b = false
  33.       }else{
  34.         this.b = true
  35.       }
  36.     }
  37.     ,doone(){
  38.         this.todata='哈哈哈哈哈哈哈哈哈哈哈哈    }
  39.     ,dotwo(){
  40.         alert(this.todata);
  41.     }
  42.     ,dothree(){
  43.         alert('向子组件传递方法');
  44.     }
  45.     ,dofour(e){
  46.       //在这测试我发现个本质,把这个方法传递给子组件时,其实 就是 子组件【触发】 父组件的方法
  47.       // 在这里灵活应用 就可以 形成 子组件向 父组件传值
  48.         this.mvc='哈哈哈'
  49.     }
  50.   },
  51.   name: "app",
  52.   components: {         //这用于组件的注册,
  53.     'v-head':Head
  54.   }
  55.   ,mounted(){
  56.     // alert('home挂载到demo后')
  57.   }
  58. };
  59. </script>
  60. <style scoped>
  61. .lmtest {
  62.   background: #000;
  63.   color: #fff;
  64. }
  65. h2 {
  66.   font: 10px;
  67. }
  68. </style>
复制代码


再贴个 head.vue的【就是子组件】
  1. <template>
  2.     <div id="head">
  3.         <h2>  这是头部组件  </h2>
  4.         这是从父组件中接收到的值--------{{todata}}
  5.         <hr>
  6.         <button @click="dofour()">点我改变子组件的值</button>  
  7.         <button @click="dothree()">接收父组件传过来的方法</button>
  8.         <button @click="abc()">接收传递过来的整个父组件实例</button>
  9.     </div>
  10. </template>
  11. <script>
  12. export default {
  13.   data(){
  14.     return {
  15.       f:'这是子组件'
  16.     }
  17.   }
  18.   ,props:['todata','dothree','dofour', 'home']  //这个没有验证
  19.   // ,props:{           // 验证版本, 也包括设置默认值
  20.   //   'todata':String,    //字符串
  21.   //   'dothree':Function, //方法
  22.   //   'home':Object,      //对象   
  23.   //   'propB': [String, Number], 多个可能的类型
  24.         // 'm':{                  //这就牛逼了 还可以设置默认值
  25.         //   type: Number,
  26.         //   default: 100
  27.         // },
  28.   // }
  29.   ,methods:{
  30.     abc(){
  31.       // 既然可以整个实例传过来,那在子组件中就这么接收
  32.       alert(this.home.mvc)
  33.       // 使用方法
  34.       this.home.doone()
  35.     }
  36.   }
  37. };
  38. </script>
  39. <style>
  40. </style>
复制代码

最后聊聊这个 props 的验证问题:
视频里说这玩意没啥用, 我个人觉得——尼玛报错报控制台有个鬼用啊; 不过默认值还不错

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表