2016-11-18 7 views
0

私はVue 2.0でシングルファイルコンポーネントアプローチを使用しています。私は3つのコンポーネントApp(親)、AppHeader、およびFormModalを持っています。 AppHeaderおよびFormModalは、直接子のAppとお互いの兄弟です。Vue.js 2.0でインポートされた兄弟コンポーネントの値を変更する適切な方法は何ですか?

AppHeaderのボタンをクリックすると、FormModalの視認性を切り替える必要があります。私が持っている問題は、Vueの単方向データフローを理解することです。フォームの可視性を変更することを知らせるために、親に戻るイベント(App)をAppHeaderからどのように渡すことができますか?

(AppHeader.vue)

<template> 
    <header> 
     <div class="app-header"> 
      <h1 class="app-title">Sample Header</h1> 
      <a class="link-right" v-on:click="toggleModal()" href="#"> 
       <i class="fa fa-pencil-square-o"></i> 
      </a> 
     </div> 
    </header> 
</template> 

<script> 
    import FormModal from "./FormModal.vue"; 
    export default { 
     name : "AppHeader", 
     props : ['visible'], 
     methods : { 
      toggleModal() { 
       this.visible = !this.visible; 
      } 
     }, 
     components : { 
      FormModal 
     } 
    } 
</script> 

(FormModal.vue)

<template> 
    <div class = "form-content" v-if="visible"> 
     <!-- Some form markup --> 
    </div> 
</template> 

<script> 
    export default { 
     name : "FormModal", 
     props : ['visible'] 
     //Also have data, methods, and computed here, but they aren't relevant to the example. 
    } 
</script> 

私は確かにこの例では、小道具の概念をしくじってきました。私は、テンプレートをインポートするときに小道具を使う正しい方法については非常に混乱しています。

編集:

が私を許し、これはVueのでの作業私の最初の日です。私は最初、非常に重要な情報を除外しました。私のApp.vueファイルは、私のすべてのテンプレートの親です。要約すると

(App.vue)

<template> 
    <div class="app"> 
     <AppHeader></AppHeader> 
     <FormModal></FormModal> 
    </div> 
</template> 

<script> 
    import AppHeader from "./AppHeader.vue"; 
    import Compose from "./FormModal.vue"; 
    export default { 
     data() { 
      return { 
       views : [AppHeader, FormModal] 
      } 
     }, 
     components : { 
      AppHeader, 
      FormModal 
     } 
    } 
</script> 

、アプリケーションは親です。 2つの兄弟、AppHeaderFormModalがあります。ボタンがAppHeaderでクリックされると、FormModalの表示を切り替える必要があります。

私はまだVueの単方向データフローを十分に把握していませんが、このシナリオにどのようにアプローチするかはわかりません。

+0

あなたの質問は不完全なようです。どのように実際にフォームのモーダルコンポーネントをレンダリングしますか? –

+0

あなたは正しいです。デイビッドと私はただ気付いた - 私は適切な編集を行います。 – Robert

+0

@DavidL完全な画像を表示するために投稿を編集しました。良いキャッチ。 – Robert

答えて

1

"visible" data fieldを子(フォームモーダル)コンポーネントの"visible"属性にバインドする必要があります。これは、子コンポーネント内の"visible "data fieldAppHeader"visible"のプロパティが "緊密"になり、 "可視"データフィールドに対して行われた変更がフォームモーダルに反映されることを意味します。

<form-modal :visible="visible"/> 
... 
<script> 
import FormModal from "./FormModal.vue"; 
export default { 
    name : "AppHeader", 
    data() { 
     return { 
     visible: false 
     } 
    }, 
    methods : { 
     toggleModal() { 
      this.visible = !this.visible; 
     } 
    }, 
    components : { 
     FormModal 
    } 
} 
</script> 

FormModalテンプレート:

<template> 
    <div class="form-conten" v-if="visible"> 
     <!-- Some form markup --> 
    </div> 
</template> 

<script> 
    export default { 
    name : "FormModal", 
    props : ['visible'] 
    } 
</script> 

アイデアは、あなたのFormModalが、それは親から来る「目に見える」小道具のいずれかの変更を待機するということです。それを「読み込み専用」変数と考えてください(FormModalで)。

+0

ねえ、作り、編集してください。FormModalテンプレートは、次のものの代わりにv-if = "visible"を読み込む必要があります。visible = "visible" – Robert

+1

@Robert 'v-if =" visible "を指定した場合、正しく使用したと思います。子コンポーネント内の小道具は「読み取り専用」変数なので、たとえば、親(AppHeader)コンポーネントの値を変更することはできません。 – euvl

+0

要素を使って、何をしているのかを明確にすることができますか?私はこれがどこに当てはまるか正確にはわかりません。また、親コンポーネントの小道具を編集できない場合、どのように視認性を切り替えることができますか? noobの質問に申し訳ありません:/。 – Robert

関連する問題