鍍金池/ 問(wèn)答/C  HTML/ vue子組件數(shù)據(jù)變了為什么父組件沒(méi)有變?

vue子組件數(shù)據(jù)變了為什么父組件沒(méi)有變?

不是父子通信時(shí)不使用計(jì)算屬性子組件改變時(shí)也會(huì)影響父組件的數(shù)據(jù)嗎?為什么這個(gè)子組件+1了父組件卻還是10?還是我寫(xiě)的例子本身就不對(duì)?

<!DOCTYPE html>
<html>
<head>
   <title></title>
   <style type="text/css">
   </style>
   <script src="vue.js"></script>
   <script type="text/javascript">
      window.onload=function(){
         var user={
            template:'#my_div',
            props:['message'],
            methods:{
              add(){
                this.message++;
                this.$emit('increment1');
              }
            }
         }
         new Vue({
               el:'#app',
               data:{
                test:10
               },
               components:{
                  'user':user
               },
               methods:{
                  incrementTotal: function () {
                      alert(this.test);
                  }
               }
         })
      }
   </script>
</head>
<body>
<template id="my_div">
  <div>
    <h3>{{message}}</h3>
    <button @click=add()>增加</button>
  </div>
</template>
<div id="app">
    <user :message="test" v-on:increment1="incrementTotal"></user>
</div>
</body>
</html>
回答
編輯回答
替身

寫(xiě)的例子是有問(wèn)題的.
來(lái)理一下思路:
父組件: test(10),通過(guò)props 單向 傳遞給子組件 --->test(10) ,message(10),

子組件: 每當(dāng)click一下就message 就+1, message非對(duì)象/數(shù)組, 所以對(duì)父組件的test沒(méi)有影響 ---> test(10), message(11).

子組件并觸發(fā)父組件的increment1事件,父組件執(zhí)行了 alert(this.test);--->test(10), message(11)
這個(gè)過(guò)程并沒(méi)有對(duì)父組件test有任何的改變.所以還是10.

實(shí)現(xiàn)改變父組件的test可以這么做:

// 1, 傳參給父組件
add(){
    this.message++;
    this.$emit('increment1',this.message);
  }
...
 incrementTotal: function (message) {
    this.test= message;
    alert(this.test);
      }
// 2. 直接觸發(fā)父組件的+1操作
add(){
    this.message++;
    this.$emit('increment1');
  }
...
 incrementTotal: function () {
    this.test++;;
    alert(this.test);
    }
2017年3月15日 14:45
編輯回答
孤影

寫(xiě)的例子有問(wèn)題,不要直接操作父組件傳過(guò)來(lái)的message,看看文檔

可以在子組件這樣設(shè)置

prop:['message'],
data(){
    msg:this.message//初始化,避免直接操作prop
},
methods:{
    add(){
        this.msg++;
        this.$emit('add',this.msg);
    }
}

在父組件監(jiān)聽(tīng)add,然后更新父組件的test值。

2018年5月4日 08:07
編輯回答
痞性

單項(xiàng)數(shù)據(jù)流要更新父組件的話,你給把需要更新的值 dispatch 回父組件之后,然后父組件再根據(jù)這個(gè)回傳的值(也可以不根據(jù))來(lái)做更新邏輯。

你這里的情況,其實(shí)更新 message 的邏輯可以直接放入到父組件中,然后子組件只根據(jù)傳入的 prop 進(jìn)行渲染,然后 dispatch 事件回父組件,之后再在父組件的回調(diào)函數(shù)中,更新傳入子組件的 vm 即可。

2017年6月23日 05:32
編輯回答
吢丕

如果要子父組件同步傳入的數(shù)據(jù)同步變化可以用.sncy修飾符?;蛘哂胿uex來(lái)代替?zhèn)鲄?/p>

2018年9月11日 17:24