LoginSignup
16
16

More than 5 years have passed since last update.

Vue.jsで親ViewModelにcomponentをぶら下げてデータを共有

Last updated at Posted at 2015-08-26

あるページに一つの親ViewModelがあって、そいつが持っているDataModelを親ViewModel配下のcomponentがいじるような設計を試してみた。

構成は以下のような感じ

Vue_component.png

ViewModelのdataにDataModelを入れてその値をcomponentが読み出す感じ。

ソースは以下

<h1>Component Test</h1>
<div class="main">
    {{title}}
    <my-component-one data="{{$data}}"></my-component-one>
    <my-component-two data="{{$data}}"></my-component-two>
    <button v-on="click:output">
        check
    </button>
</div>
<div class="output">
</div>
<my-component></my-component>
var dataModel = {
    title: "Title",
    one: "component1",
    two: "component2"
};

var MyComponent_one = Vue.extend({
    template: '<p v-on="click:rewrite">{{data.one}}</p>',
    props: ['data'],
    methods:{
        rewrite: function(){
            this.data.one = "rewrite";
        }
    }
});

var MyComponent_two = Vue.extend({
    template: '<p v-on="click:rewrite">{{data.two}}</p>',
    props: ['data'],
    methods:{
        rewrite: function(){
            this.data.two = "rewrite";
        }
    }
});

var mainViewModel = new Vue({
    el: ".main",
    data: dataModel,
    methods: {
        output: function(){
            $('.output').html(this.$data.one + " " + this.$data.two);
        }
    },
    components: {
        "my-component-one": MyComponent_one,
        "my-component-two": MyComponent_two
    }
});

文字列をクリックしたらデータが書き換わる。checkボタンでDataModelの中身を確認すると書き換わっているのがわかる。

vue_component.gif

この設計がいいかはわからないけど、とりあえずやりたいことはできた。

jsfiddle

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16