teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/12/02 08:36

投稿

karamarimo
karamarimo

スコア2555

answer CHANGED
@@ -7,4 +7,40 @@
7
7
  round
8
8
  @click="changeColor(google)"
9
9
  >
10
- ```
10
+ ```
11
+
12
+ # 追記
13
+
14
+ コンポーネントが、自身の prop の値を直接変更してはいけません。ではクリック時に type を変えるにはどうするかというと、type prop は親コンポーネントから与えられるので、親がクリックイベント発生時に type の値を変更します。
15
+
16
+ クリックするたびに`type`が`success`と`primary`の間を切り替わるコードの例です。
17
+ [Codesandbox Demo](https://codesandbox.io/s/zqwp96qnwm)
18
+ ```html
19
+ <template>
20
+ <div>
21
+ <el-button :type="buttonType" @click="toggleButtonType">Button</el-button>
22
+ </div>
23
+ </template>
24
+
25
+ <script>
26
+ export default {
27
+ data() {
28
+ return {
29
+ buttonType: 'success',
30
+ }
31
+ },
32
+ methods: {
33
+ toggleButtonType() {
34
+ this.buttonType = this.buttonType === 'success' ? 'primary' : 'success'
35
+ },
36
+ },
37
+ }
38
+ </script>
39
+ ```
40
+
41
+ 公式ガイドも読むといいと思います。
42
+ [単方向のデータフロー - Vue](https://jp.vuejs.org/v2/guide/components-props.html#%E5%8D%98%E6%96%B9%E5%90%91%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC)
43
+
44
+ > 全てのプロパティは、子プロパティと親プロパティの間に、 単方向のバインディング を形成します: 親のプロパティが更新されると、子へと流れ落ちていきますが、それ以外の方法でデータが流れることはありません。これによって、子コンポーネントが誤って親の状態を変更することがなく、これによって、アプリのデータフローを 理解しづらい 可能性のある子コンポーネントによる誤った親の状態変更から、防ぎます。
45
+
46
+ > また、親コンポーネントが更新されるたびに、子コンポーネント内の全てのプロパティが最新の値へと更新されます。これは、子コンポーネント内において、プロパティを 変化させない ことを意味しています。それを行った場合、 Vue は コンソールにて警告します。