2016-11-16 411 views
3

在Vue.js中覆蓋使用mixins的方法的正確方法是什麼?我知道你可以使用mixin來模擬繼承,但是假設你想擴展一些道具,但是不能完全覆蓋整個道具的價值。正確的方式來覆蓋Vue.js中的屬性和方法?

比如我有一個baseCell,但我也需要有這將是類似的,但功能不同的<td> S和<th> S三個分量,所以我創建使用baseCell作爲混入兩個額外的組件。

var baseCell = { 
    ... 
    props: { 
    ... 
    initWrapper: { 
     type: String, 
     default: 'td' 
    }, 
    ... 
    }, 
    methods: {..} 
}; 

在組件設置中,道具會完全覆蓋所有的值。

Vue.component('tableHeader', { 
    mixins: [baseCell], 
    props: { 
    initWrapper: { 
     default: 'th' 
    } 
    } 
} 

我想出了一個合併屬性的解決方案,但它似乎有點哈克,我不知道是否有更好的解決方案。

Vue.component('tableHeader', { 
    mixins: [baseCell], 
    props: Object.assign({}, baseCell.props, { 
    initWrapper: { 
     default: 'th' 
    } 
    }) 
}); 

有了這個,我保留了baseCell道具,但是對象中的一些已定義的道具已通過。

+1

文檔https://vuejs.org/v2/guide/mixins.html#Option-Merging明確指出,該組件將採取precendence上合併。因此,您的解決方案似乎非常合理。 –

+0

@DavidL謝謝你看這個問題。我看過那部分文檔,但只是看了一眼。您的評論讓我深入瞭解了源代碼,因此我發現這個問題解決了合併數據和道具的問題... https://github.com/vuejs/vue/issues/2897它看起來像目前的解決方案就是像我現在這樣做。 – kyle

+1

同意,基於這個問題,它絕對看起來像你選擇了正確的解決方案。樂於幫助:) –

回答