提供80+媒體資源
我司提供互聯(lián)網(wǎng)廣告營(yíng)銷服務(wù)超10年,擁有專業(yè)的人才儲(chǔ)備
【 服務(wù)熱線 】4009602809
一、快手廣告投放-抽象節(jié)點(diǎn)
1.快手推廣賬戶在組件中使用抽象節(jié)點(diǎn),有時(shí),自定義組件模板中的一些節(jié)點(diǎn),其對(duì)應(yīng)的自定義組件不是由自定義組件本身確定的,而是自定義組件的調(diào)用者確定的。這時(shí)可以把這個(gè)節(jié)點(diǎn)聲明為“抽象節(jié)點(diǎn)”。
例如,我們現(xiàn)在來(lái)實(shí)現(xiàn)一個(gè)“選框組”(selectable-group)組件,它其中可以放置單選框(custom-radio)或者復(fù)選框(custom-checkbox)。這個(gè)組件的 ksml 可以這樣編寫:
代碼示例
<!-- selectable-group.ksml --> <view ks:for="{{labels}}"> <label> <selectable disabled="{{false}}"></selectable> {{item}} </label> </view> |
其中,“selectable”不是任何在 json 文件的usingComponents 字段中聲明的組件,而是一個(gè)抽象節(jié)點(diǎn)。它需要在 componentGenerics 字段中聲明:
{ "componentGenerics": { "selectable": true } } |
2.快手短視頻廣告-使用包含抽象節(jié)點(diǎn)的組件
在使用selectable-group 組件時(shí),必須指定“selectable”具體是哪個(gè)組件:
<selectable-group generic:selectable="custom-radio" /> |
這樣,在生成這個(gè) selectable-group組件的實(shí)例時(shí),“selectable”節(jié)點(diǎn)會(huì)生成“custom-radio”組件實(shí)例。類似地,如果這樣使用:
<selectable-group generic:selectable="custom-checkbox" /> |
“selectable”節(jié)點(diǎn)則會(huì)生成“custom-checkbox”組件實(shí)例。
注意:上述的 custom-radio 和 custom-checkbox 需要包含在這個(gè)ksml對(duì)應(yīng) json 文件的usingComponents 定義段中。
{ "usingComponents": { "custom-radio": "path/to/custom/radio", "custom-checkbox": "path/to/custom/checkbox" } } |
3.快手信息流廣告抽象節(jié)點(diǎn)的默認(rèn)組件
抽象節(jié)點(diǎn)可以指定一個(gè)默認(rèn)組件,當(dāng)具體組件未被指定時(shí),將創(chuàng)建默認(rèn)組件的實(shí)例。默認(rèn)組件可以在 componentGenerics 字段中指定:
{ "componentGenerics": { "selectable": { "default": "path/to/default/component" } } } |
4.快手推廣費(fèi)用自定義組件擴(kuò)展-擴(kuò)展后的效果
為了更好的理解擴(kuò)展后的效果,先舉一個(gè)例子:
// behavior.js module.exports = Behavior({ definitionFilter(defFields) { defFields.data.from = 'behavior' }, }) |
// component.js Component({ data: { from: 'component' }, behaviors: [require('behavior.js')], ready() { console.log(this.data.from) // 此處會(huì)發(fā)現(xiàn)輸出 behavior 而不是 component } }) |
通過(guò)例子可以發(fā)現(xiàn),自定義組件的擴(kuò)展其實(shí)就是提供了修改自定義組件定義段的能力,上述例子就是修改了自定義組件中的 data 定義段里的內(nèi)容。
5.快手廣告賬戶使用擴(kuò)展
Behavior() 構(gòu)造器提供了新的定義段definitionFilter,用于支持自定義組件擴(kuò)展。 definitionFilter 是一個(gè)函數(shù),在被調(diào)用時(shí)會(huì)注入兩個(gè)參數(shù),第一個(gè)參數(shù)是使用該 behavior 的 component/behavior 的定義對(duì)象,第二個(gè)參數(shù)是該behavior所使用的behavior 的definitionFilter 函數(shù)列表。以下舉個(gè)例子來(lái)說(shuō)明:
// behavior3.js module.exports = Behavior({ definitionFilter(defFields, definitionFilterArr) {}, }) // behavior2.js module.exports = Behavior({ behaviors: [require('behavior3.js')], definitionFilter(defFields, definitionFilterArr) { // definitionFilterArr[0](defFields) }, }) // behavior1.js module.exports = Behavior({ behaviors: [require('behavior2.js')], definitionFilter(defFields, definitionFilterArr) {}, }) // component.js Component({ behaviors: [require('behavior1.js')], }) |
上述代碼中聲明了 1 個(gè)自定義組件和 3 個(gè) behavior,每個(gè) behavior 都使用了 definitionFilter定義段。那么按照聲明的順序會(huì)有如下事情發(fā)生:
當(dāng)進(jìn)行 behavior2的聲明時(shí)就會(huì)調(diào)用 behavior3 的 definitionFilter 函數(shù),其中 defFields 參數(shù)是 behavior2 的定義段, definitionFilterArr 參數(shù)即為空數(shù)組,因?yàn)?behavior3 沒(méi)有使用其他的 behavior 。
當(dāng)進(jìn)行 behavior1 的聲明時(shí)就會(huì)調(diào)用 behavior2 的 definitionFilter 函數(shù),其中 defFields 參數(shù)是 behavior1 的定義段, definitionFilterArr 參數(shù)是一個(gè)長(zhǎng)度為 1 的數(shù)組,definitionFilterArr[0] 即為 behavior3 的 definitionFilter 函數(shù),因?yàn)?behavior2 使用了 behavior3。用戶在此處可以自行決定在進(jìn)行 behavior1 的聲明時(shí)要不要調(diào)用 behavior3 的 definitionFilter 函數(shù),如果需要調(diào)用,在此處補(bǔ)充代碼 definitionFilterArr[0](defFields) 即可,definitionFilterArr 參數(shù)會(huì)由基礎(chǔ)庫(kù)補(bǔ)充傳入。
同理,在進(jìn)行 component 的聲明時(shí)就會(huì)調(diào)用 behavior1 的 definitionFilter 函數(shù)。
簡(jiǎn)單概括,definitionFilter 函數(shù)可以理解為當(dāng) A 使用了 B 時(shí),A 聲明就會(huì)調(diào)用 B 的 definitionFilter 函數(shù)并傳入 A 的定義對(duì)象讓 B 去過(guò)濾。此時(shí)如果 B 還使用了 C 和 D ,那么 B 可以自行決定要不要調(diào)用 C 和 D 的 definitionFilter 函數(shù)去過(guò)濾 A 的定義對(duì)象。
6.快手推廣案例代碼示例-真實(shí)案例
下面利用擴(kuò)展簡(jiǎn)單實(shí)現(xiàn)自定義組件的計(jì)算屬性功能
// behavior.js module.exports = Behavior({ lifetimes: { created() { this._originalSetData = this.setData // 原始 setData this.setData = this._setData // 封裝后的 setData } }, definitionFilter(defFields) { const computed = defFields.computed || {} const computedKeys = Object.keys(computed) const computedCache = {} // 計(jì)算 computed const calcComputed = (scope, insertToData) => { const needUpdate = {} const data = defFields.data = defFields.data || {} for (let key of computedKeys) { const value = computed[key].call(scope) // 計(jì)算新值 if (computedCache[key] !== value) needUpdate[key] = computedCache[key] = value if (insertToData) data[key] = needUpdate[key] // 直接插入到 data 中,初始化時(shí)才需要的操作 } return needUpdate } // 重寫 setData 方法 defFields.methods = defFields.methods || {} defFields.methods._setData = function (data, callback) { const originalSetData = this._originalSetData // 原始 setData originalSetData.call(this, data, callback) // 做 data 的 setData const needUpdate = calcComputed(this) // 計(jì)算 computed originalSetData.call(this, needUpdate) // 做 computed 的 setData } // 初始化 computed calcComputed(defFields, true) // 計(jì)算 computed } }) |
在組件中使用:
const beh = require('./behavior.js') Component({ behaviors: [beh], data: { a: 0, }, computed: { b() { return this.data.a + 100 }, }, methods: { onTap() { this.setData({ a: ++this.data.a, }) } } }) |
<view>data: {{a}}</view> <view>computed: {{b}}</view> <button bindtap="onTap">click</button> |
實(shí)現(xiàn)原理很簡(jiǎn)單,對(duì)已有的 setData 進(jìn)行二次封裝,在每次 setData 的時(shí)候計(jì)算出 computed 里各字段的值,然后設(shè)到 data中,已達(dá)到計(jì)算屬性的效果。此實(shí)現(xiàn)只是作為一個(gè)簡(jiǎn)單案例來(lái)展示,請(qǐng)勿直接在生產(chǎn)環(huán)境中使用。
任何行業(yè)選擇投放快手廣告還是不錯(cuò)的,投放廣告要趁早!如果您想做快手的廣告投放,我們推薦您選一合適的平臺(tái)來(lái)做。最近很火的一家快手廣告代理,北京巨宣網(wǎng)絡(luò)廣告有限公司,從廣告開(kāi)戶到投放全流程都有專業(yè)人員來(lái)做,現(xiàn)在開(kāi)戶的費(fèi)用只需要5000元,咨詢電話:4009602809
我司提供互聯(lián)網(wǎng)廣告營(yíng)銷服務(wù)超10年,擁有專業(yè)的人才儲(chǔ)備
擁有單賬戶日消耗百萬(wàn)運(yùn)營(yíng)經(jīng)驗(yàn),廣告賬戶總量超1萬(wàn)!
賬戶開(kāi)通后,提供專業(yè)的建站運(yùn)營(yíng)服務(wù),百名運(yùn)營(yíng)服務(wù)!
如無(wú)需我司進(jìn)行代運(yùn)營(yíng),可提供較高返點(diǎn)政策,靠譜!
專注信息流廣告/直播廣告/搜索廣告/短視頻廣告開(kāi)戶服務(wù)!