如何在当前Vue实例上添加方法或数据?

Chr*_*eza 2 javascript vue.js

我是Vue.js的新手,我正在搞乱它.有没有办法创建可重用的方法和数据?

这是我想要实现的非常简单的代码:

page1.html

<div id="app">
  <button type="button" v-on="click: foo()">Foo</button> 
  <button type="button" v-on="click: bar()">Bar</button>
</div>

<script src="reusable.js"></script> 
<script src="page1.js"></script>  <-- Custom script -->
Run Code Online (Sandbox Code Playgroud)

page2.html

<div id="app">
  <button type="button" v-on="click: foo()">Foo</button> 
  <button type="button" v-on="click: baz()">Baz</button>
</div>

<script src="reusable.js"></script> 
<script src="page2.js"></script>  <-- Custom script -->
Run Code Online (Sandbox Code Playgroud)

reusable.js

var vm = new Vue({
  el: '#app',
  data: {
    name: 'John'
  },
  methods: {
    foo: function(){
      console.log('foo');
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

现在我想在我的reusable.js的VM 上访问数据或添加方法,所以我可以在page1.jspage2.js上访问它.我不知道该怎么做,但我希望实现这样的目标:

page1.js

// adds a new method on my reusable.js's vm
vm.extend({
  methods: {
    bar: function(){
      // triggers when I click the bar button
      console.log('bar'); 
      console.log(this.name); // John
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

page2.js

// adds a new method on my reusable.js's vm
vm.extend({
  methods: {
    baz: function(){
      // triggers when I click the baz button
      console.log('baz');
      console.log(this.name); // John
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

我知道那vm.extend是错的(我只是让你们知道我想要实现的目标).

你有什么建议吗?

Jih*_*ada 9

也许你可以使用mixins?非常像这样:

var mix = {
    methods : {
        bar : function() {
            console.log('bar')
        }
    }
};

var demo = new Vue({
    el: '#demo',
    mixins : [mix],
    methods : {
        foo: function() {
            console.log('foo')
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/dewey92/yMv7y/965/

资料来源:http://vuejs.org/guide/extending.html

所以在你的情况下:

Page1.html:

<div id="app">
    <button type="button" v-on="click: foo()">Foo</button> 
    <button type="button" v-on="click: bar()">Bar</button>
</div>

<script src="page1.js"></script>  <-- Custom script (or page2.js) -->
<script src="reusable.js"></script> 
Run Code Online (Sandbox Code Playgroud)

page1.js:

var mix = {
    methods : {
        bar : function() {
            console.log('bar')
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

page2.js:

var mix = {
    methods : {
        baz : function() {
            console.log('baz')
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

reusable.js:

var vm = new Vue({
        el: '#app',
        mixins: [mix],
        data: {
            name: 'John'
        }
        methods: {
            foo: function(){
                console.log('foo');
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)