Vue頁面動態(tài)添加Html標(biāo)簽中如何綁定事件

問題的背景:

說一說近期碰到的一個困擾我很久的問題吧:問題是在編寫一個vue2.0+easyUI的頁面的時候出現(xiàn)的。

easyUI的圖表,在Vue中的展示

就像這樣的一張圖表,需求很簡單,就是每一行最右邊的操作欄都有一個按鍵,可以操作單行的數(shù)據(jù)

問題的出現(xiàn):

超簡單!往里面放一個按鈕不就可以了嗎!于是,我試圖著手在這一行里放入一個按鈕,但一看代碼,Oh my god!

// 表數(shù)據(jù)

tableObj.data=[];

if(dataList.length>0) {

? ? for(vari=0; i<dataList.length; i++) {

? ? var subData={

? ? ? ? ? ?"userId":dataList[i].id,

? ? ? ? ? ?"userName":dataList[i].value,

? ? ? ? ? ?"operate":getOperateHtml(i),

? ? ?};

? ? ?tableObj.data.push(subData);

? ? ?}

}

這每一行一行的,居然全部都是只允許往里面放字符串的!!好吧,那怎么辦呢,簡單!把控件寫成字符串放進去就可以了啊,于是,我寫出了上面的operate字段中的getOperateHtml方法

functiongetOperateHtml(id) {

? ? ? var operateHtml = '<a onclick="turnToUserEdit(\''+id+'\')"'+"id='editUserBtn' style='color:#07bb49;display:none;'class='editUserBtn'>編輯"</a>";

return operateHtml;

easy!這樣的話,我在下面補上一個turnToUserEdit(id)方法不就ok了么!!

就在這里,問題出現(xiàn)了,直接在下面接一個function是無法調(diào)用到的,而如果把方法寫在window里面的話,又沒有辦法獲取到當(dāng)前vue的this對象,只能用router做一個跳轉(zhuǎn),無法操作當(dāng)前vue的對象里的數(shù)組變量。

window.turnToUserEdit=function(id){

? ? ?router.push({ path:'/userAddOrEdit',query:{userId:id}});

}

這可如何是好,這讓剛接觸vue的我慌了神

問題的剖析:

這個問題,在邏輯上來說應(yīng)該是很好理解的,出現(xiàn)這個問題,也是無比正常的

在我的理解中,對vue代碼的理解,需要分為編譯前和編譯后,用動態(tài)添加Html標(biāo)簽的方法,實際上就是在編譯后添加進這個html語句,再生成這個控件,這時候在控件里寫的onclick就是去找編譯后的叫這個名稱的方法,而直接寫function的話,就生成的是編譯前的方法,生成html之后在去找這個方法,必然是找不到的,找到的只能是后面寫在window.function的全局方法,這個情況就像是下圖

a標(biāo)簽的編譯前后示意圖

那么,調(diào)用到了window.EditUser方法,那必然是拿不到當(dāng)前vue的this指針的,因為編譯后等于是把各個vue都混在了一起,誰分得清楚你和我呢!

問題的解決:

額,那,咋辦呢。。。

琢磨了很長時間,參考了segmentFault和stackOverflow上的一些意見,大致的意思是,這個地方,要建一個vue(帶方法的)再給他編譯一下,然后塞到這個按鈕里,怎么塞進按鈕里呢,就是編譯完之后,找到我們之前放的這個a標(biāo)簽的節(jié)點,給它append一個child,放進我們的這個vue,這樣事件就可以自定義,而且能獲取到當(dāng)前的對象啦!具體的寫法的話大致是這樣噠!

varMyComponent=Vue.extend({

? ? template: '<a style="color:#07bb49;" v-on:click="world('+"'"+id+"'"+')">刪除</a>',

? ? methods:{

? ? ? ? ?world:function(id) {

? ? ? ? ? ? ? ? alert(this.data);

? ? ? ? ? }

? ? }

});

varcomponent= newMyComponent().$mount();

document.getElementById('edituser').appendChild(component.$el);

至于第幾行什么的,在這個edituser的a標(biāo)簽的id后面追加一個行號就可以了。

至此,事件圓滿解決啦~


稍微總結(jié)一下:

? ? ? ?出現(xiàn)這個現(xiàn)象的主要問題在vue的編譯前和編譯后不同的這個特性中,個人覺得,如果可以,還是應(yīng)該盡量的去避免動態(tài)添加html標(biāo)簽,easyUI這個寫法比較特殊,也可能有其他的控件有這種特殊的要求,在一般的操作中,還是使用v-的標(biāo)簽來進行顯示的選擇比較好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,074評論 0 29
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,033評論 25 708
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,241評論 0 6
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,509評論 0 17
  • 坐的公交車出事故了,和一輛出租車發(fā)生了嚴(yán)重刮碰。 公交車有些劃痕,出租車前保險杠粉碎性報廢。事故還殃及了路邊違停的...
    LKNGFRWHT閱讀 329評論 0 0