<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <script src="vue.js"></script>
    </head>
    <body>
        <div>
        <h1>--選項(xiàng)合并--</h1>
        <script>
        //當(dāng)組件和混入對(duì)象含有同名選項(xiàng)時(shí),這些選項(xiàng)將以恰當(dāng)?shù)姆绞竭M(jìn)行“合并”。
        //比如,數(shù)據(jù)對(duì)象在內(nèi)部會(huì)進(jìn)行遞歸合并,并在發(fā)生沖突時(shí)以組件數(shù)據(jù)優(yōu)先。
        var mixin = {
            data: function () {
                return {
                    message: 'hello',
                    foo: 'abc'
                }
            }
        }
        new Vue({
            mixins: [mixin],
            data: function () {
                return {
                    message: 'goodbye',
                    bar: 'def'
                }
            },
            created: function () {
                console.log(this.$data)
            }
        })
        </script>
        <script>
        //同名鉤子函數(shù)將合并為一個(gè)數(shù)組,因此都將被調(diào)用。
        //另外,混入對(duì)象的鉤子將在組件自身鉤子之前調(diào)用。
        var mixin = {
            created: function () {
                console.log('混入對(duì)象的鉤子被調(diào)用')
            }
        }
        
        new Vue({
            mixins: [mixin],
            created: function () {
                console.log('組件鉤子被調(diào)用')
            }
        })
        // => "混入對(duì)象的鉤子被調(diào)用"
        // => "組件鉤子被調(diào)用"
        </script>
        <script>
        //值為對(duì)象的選項(xiàng),例如 methods、components 和 directives,
        //將被合并為同一個(gè)對(duì)象。兩個(gè)對(duì)象鍵名沖突時(shí),取組件對(duì)象的鍵值對(duì)。
        //注意:Vue.extend() 也使用同樣的策略進(jìn)行合并。
        var mixin = {
          methods: {
            foo: function () {
              console.log('foo')
            },
            conflicting: function () {
              console.log('from mixin')
            }
          }
        }

        var vm = new Vue({
          mixins: [mixin],
          methods: {
            bar: function () {
              console.log('bar')
            },
            conflicting: function () {
              console.log('from self')
            }
          }
        })

        vm.foo() // => "foo"
        vm.bar() // => "bar"
        vm.conflicting() // => "from self"
        </script>
        <h1>--全局混入--</h1>
        <script>
        Vue.mixin({
            created: function () {
                var myOption = this.$options.myOption
                if (myOption) {
                    console.log(myOption)
                }
            }
        })
        
        new Vue({
            myOption: 'hello!'
        })
        </script>
        </div>
    </body>
</html>