鍍金池/ 問答/HTML/ vuejs如何在子組件內(nèi)輸出參數(shù)中的html

vuejs如何在子組件內(nèi)輸出參數(shù)中的html

情況是這樣的,項目用了eliment ui,并把table組件封裝了一個子組件,內(nèi)部片段的column是這樣的:

// 子組件內(nèi)部
<el-table-column v-for="(item,index) in fields" :key="index" :label="item.title" :width="item.width">
    <template slot-scope="scope" v-html="">
        {{ item.content ? item.content(scope.row) : scope.row[item.name] }} // 這一行
    </template>
</el-table-column>

其中fields是數(shù)據(jù)的每個字段用到了循環(huán),字段的顯示內(nèi)容content()返回為文本時沒問題。

但是如果想自定義這個內(nèi)部的樣式,必須添加一個button,就不行了。一下是組件內(nèi)的data部分:

// 父組件的data:
...
 fields : [
    {title :'時間' ,width:"180",content:(row)=>{ // 這里字符是沒有問題的
        return new Date(row.start).format("MM-dd hh:mm") + " ~ " + new Date(row.end).format("hh:mm D") + (row.clash !=null ? " [有沖突] " : "" )
    }},
    {name:"user_name" ,  title :'姓名' ,width:'80' },
    {name:'product_name', title :'課程' , content:(row)=>{ 
        return "<button>有問題的地方</button>";  //->求解的地方
    }},
    {name:'title', title :'課題'},
    ...
],
...

結(jié)果輸出的時候吧"<button>有問題的地方</button>"當文本輸出了。

就不知道怎么辦了。求解。大神在不?

回答
編輯回答
涼心人

https://cn.vuejs.org/v2/guide...
雙大括號會將數(shù)據(jù)解釋為普通文本,而非 HTML 代碼。為了輸出真正的 HTML,你需要使用 v-html 指令.

2018年4月1日 04:02
編輯回答
柒喵

方法一:

基本解決,方法如下,使用了vue的 createElement 渲染函數(shù),但是需要改造一下。首先父組件data里這樣了:

 {title :'課時簽到', content:function(h){ 
        console.log(this.text);
        return h( 'el-tag',{
            attrs: { size : "mini" },
            on: {
                click: function (event) {
                    alert(event)
                }
            }
        }, '搞定' );
    }},
   
然后子組件,建了一個孫子組件:
```
// 模板部分
 <template slot-scope="scope">
    <node-content :content="item.content" :text="scope.row[item.name]" :row="scope.row"></node-content> // 孫子組件
</template>


// 子組件的compments 加上:

components: {
    NodeContent: {
        props : {
            content:Function,
            text:{},
            row: {}
        },
        render: function render(h) {
            // 如果有content函數(shù)就渲染,沒有就直接輸出文本。
            if(this.content) return this.content.call(h,...arguments); // 就是這里。 
            else return h('span',this.text);
        }
    }
},
```
h就是 createElement() ,createElement語法很D疼,沒有直接寫標簽痛快。
基本解決,遺留問題是,如何把row,傳給父組件的content方法了。

**方法二**
完美解決,參考了elementui里的tree的寫法。
在父組件的data里這么寫,定義一個渲染內(nèi)容
```
{title :'課時簽到e', content:(row)=>{
return (
    <el-button onClick={()=> this.showSigns(row.id) } type="text" size="small" ></el-button>
)

} },


然后在子組件里:
模板:
<template slot-scope="scope">
    <node-content :content="item.content" :row="scope.row"></node-content>
</template>

components里:
 components: {
    NodeContent: {
        props: {
            content:{},
            row:{},
        },
        render: function render(h) {
            return this.content(this.row);
        }
    }
},
2018年4月30日 08:25
編輯回答
誮惜顏
<el-table-column v-for="(item,index) in fields" :key="index" :label="item.title" :width="item.width">
    //換成這樣試試
    <template slot-scope="scope" v-html="item.content ? item.content(scope.row) : scope.row[item.name]">
    </template>
</el-table-column>
2018年4月9日 17:08
編輯回答
避風(fēng)港
{name:'address', title :'課程' , content:(row)=>{ 
    return <button on-click={($event) => this.handleClick($event) } >有問題的地方</button>; } }
 },
NodeContent: {
     props: {
         node:'',
     },
     render(h) {
          const node = this.node
          return (
               <span >{ node.item.content ? node.item.content(node.row) : node.row[node.item.name] }</span>
           );
         }
      }
 },

<template slot-scope="scope" >
    <node-content :node="{'item':item,'row':scope.row}" ></node-content>
</template>

我這樣可以,不知道@moonwalkercui 怎么解決的,能不能貼出了,是否可以在 content:(row)=>{ }里面直接寫 render()

2018年7月30日 15:38