vue經過 template 來建立你的 HTML。可是,在特殊狀況下,這種寫死的模式沒法知足需求,必須須要js的編程能力。此時,須要用render來建立HTML。javascript
在一次封裝一套通用按鈕組件的工做中,按鈕有四個樣式(success、error、warning、default)。首先,你可能會想到以下實現html
<div class="btn btn-success" v-if="type === 'success'">{{ text }}</div> <div class="btn btn-danger" v-else-if="type === 'danger'">{{ text }}</div> <div class="btn btn-warning" v-else-if="type === 'warning'">{{ text }}</div>
這樣寫在按鈕樣式少的時候徹底沒有問題,可是試想,若是須要的按鈕樣式有十多個。那麼template寫死的方式就顯得很無力了。趕上相似這樣的狀況,使用render函數能夠說最優選擇了。vue
首先render函數生成的內容至關於template的內容,故使用render函數時,在.vue文件中須要先把template標籤去掉。只保留邏輯層。java
export default { props: { type: { type: String, default: 'normal' }, text: { type: String, default: 'normal' } }, computed: { tag() { switch (this.type) { case 'success': return 1; case 'danger': return 2; case 'warning': return 3; default: return 1; } } }, render(h) { return h('div', { class: { btn: true, 'btn-success': this.type === 'success', 'btn-danger': this.type === 'danger', 'btn-warning': this.type === 'warning' }, domProps: { innerText: this.text }, on: { click: this.handleClick } }); }, methods: { handleClick() { console.log('-----------------------'); console.log('do something'); } } };
根據組件化思惟,能抽象出來的東西毫不寫死在邏輯上。這裏的clickHandle函數能夠根據按鈕的type類型觸發不一樣的邏輯,就很少敘述了。編程
而後在父組件調用dom
<Button type="danger" text="test"></Button>
是的,要記住每一個參數的類型同用法,按序傳參實在是太麻煩了。那麼其實能夠用jsx來優化這個繁瑣的過程。函數
render() { return ( <div class={{ btn: true, 'btn-success': this.type === 'success', 'btn-danger': this.type === 'danger', 'btn-warning': this.type === 'warning' }} onClick={this.handleClick}> {this.text} </div> ); },