国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解Vue 動態添加模板的幾種方法

2024-05-06 15:17:59
字體:
來源:轉載
供稿:網友

以下方法只適用于 Vue1.0 版本,推薦系數由高到低排列。

通常我們會在組件里的 template 屬性定義模板,或者是在 *.vue 文件里的 template 標簽里寫模板。但是有時候會需要動態生成模板的需求,例如讓用戶自定義組件模板,或者設置組件的布局。

例如要做一個類 select 的組件,用戶傳入 options 數據,通過 value prop 獲取選中值,最基本的原型如下。

Vue.component('XSelect', { template: ` <div class="select"> <input :value="value" readonly /> <div class="option" v-for="option in options" @click="value = option.value"> <span v-text="option.label"></span> </div> </div>`, props: ['value','options']})

如果此時需要增加一個 API 支持讓用戶自定義 option 部分的模板。此處用 slot 并不能解決問題。

通過 $options.template 修改

通過打印組件對象可以獲得一個信息,在 $options 里定義了一個 template 屬性,寫在 template 標簽里的模板,最終編譯后也會在 $options.template 里。通過文檔的生命周期 可以得知,在 created 的時候, 實例已經結束解析選項, 但是還沒有開始 DOM 編譯 也就是說,如果用戶通過 prop 的數據我們可以獲得,但是模板其實還沒有渲染成 DOM。經過測試,在 created 修改 this.$options.template 是可以改變最終生成的 DOM 的,同時也能拿到 props 的內容。

那么我們可以修改下代碼,使其支持自定義模板

Vue.component('XSelect', { props: ['value','options', { name: 'template',default:'<span v-text="option.label"></span>' } ], created() {varoptionTpl =this.templatethis.$options.template =` <div class="select"> <input :value="value" readonly /> <div class="option" v-for="option in options" @click="value = option.value">${optionTpl} </div> </div>` }})

用戶使用是就可以傳入模板了

<x-select:value.sync="value"template="<span>標簽: {{ option.label }}, 值: {{ option.value }}</span>":options="[ {value: 1, label: 'a'}, {value: 2, label: 'b'}, {value: 3, label: 'c'} ]"></x-select>

可能存在的問題

我們知道 Vue 在內部幫我們做了許多優化,但是在這里可能會由于某些優化導致動態拼接的模板無法渲染成功。例如這里我們不使用 v-for 而是手工遍歷 options 生成需要的 HTML

consttpl = options.map(opt =>`<div>${this.optionTpl}</div>`)this.$options.template =` <div class="select"> <input :value="value" readonly>${tpl} </div>`

這里會導致一個 BUG,如果一個頁面有多個 x-select 組件,并且 options 長度不一樣,會導致長的 options 的組件后面幾個選項渲染不出來。究其原因是 Vue 會幫我們緩存模板編譯結果。翻看代碼可以找到 vue/src/instance/internal/lifecycle.js 里有做優化,同時提供的 _linkerCachable 本意是給 內聯模板 使用。我們可以通過設置

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 万州区| 沙湾县| 黔江区| 临漳县| 湖北省| 武穴市| 磴口县| 晋江市| 象山县| 工布江达县| 酒泉市| 林芝县| 大庆市| 五指山市| 时尚| 清徐县| 四会市| 明溪县| 宁陵县| 达孜县| 祁东县| 广昌县| 东乡县| 宽城| 九江县| 石楼县| 简阳市| 凤台县| 抚顺县| 山丹县| 增城市| 宁蒗| 宾阳县| 香港 | 鸡西市| 南阳市| 都匀市| 红河县| 开平市| 怀来县| 乌兰浩特市|