Vue 推薦在絕大多數情況下使用 template 來創建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全編程的能力,這就是 render 函數,它比 template 更接近編譯器
全文參考https://www.jianshu.com/p/f44a32f83cc8 的思路寫出來的。着急的小伙伴可以直接看她寫的,很棒~
iview官網例子
第一次看iview的時候都蒙蔽了,不知道啥是render,緊跟着后面那么多東西,然后今兒給縷一縷。
首先把官網的代碼copy下來放到自己運行的vue項目中

數據都是動態的,emmmm,看一下最長的就是第一個姓名,然后我看不懂,不要慌往下看。。。

我改了一下,從寫死的數據開始

這里我表格里的姓名,都是寫死的數據,並且加了樣式
{
title: '姓名',
key: 'name',
render: (h, params) => {
return h('div', { //寫你要創建的元素的標簽名
style:{ //寫元素的樣式(注意text-align等有‘-’的css屬性需要刪掉‘-’,‘-’后的字母變大寫,否則報錯)
width:'160px',
height:'100px',
background:'#ccc',
textAlign:'center',
lineHeight:'100px',
}
}, '小明') //寫元素的內容
}
},
然后我希望一個單元格里放倆元素代碼
{
title: '姓名',
key: 'name',
render: (h, params) => {
return h('div', {
style:{
width:'120px',
height:'100px',
background:'#ccc',
textAlign:'center',
lineHeight:'100px',
}
},[h('p',{ style:{
color:'red',
}
},'愛吃草')],'小明') //以數組的形式括起來內容,看我給他一個文字顏色
}
},

驚呆了,我的小明去哪里了!!!
如圖可見,當元素嵌套時,元素里面的內容會覆蓋父元素的內容
解決方法:我再套一個元素
{
title: '姓名',
key: 'name',
render: (h, params) => {
return h('div', {
style:{
width:'120px',
height:'100px',
background:'#ccc',
textAlign:'center',
lineHeight:'100px',
float:'left',
}
}, [
h('p',{ style:{
color:'red',
float:'left',
}
},'愛吃草'),
h('p',{ style:{ //我嵌套的元素
color:'yellow',
float:'left',
}
},'愛吃飯')
],'小明')
}
},

反正我現在是大概知道這個render咋用的了
{
title:'地址',
key:'address',
render:(h,params) =>{
return h('div',{
style:{
backgroundColor:'skyblue',
},
},params.row.address)
}
},

點擊事件直接在第二個參數里加就可以(官網有例子)
render: (h, params) => {
return h('div', [
h('Button', {
props: {
type: 'primary',
size: 'small'
},
style: {
marginRight: '5px'
},
on: {
click: () => {
this.show(params.index)
}
}
}, '看看'),
h('Button', {
props: {
type: 'error',
size: 'small'
},
on: {
click: () => {
this.remove(params.index)
}
}
}, '刪除')
]);
}
//h: vue Render函數的別名(全名 createElement)即 Render函數
//params: table 該行內容的對象
//props:設置創建的標簽對象的屬性
//style:設置創建的標簽對象的樣式
//on:為創建的標簽綁定事件
//所以代碼中的render函數,即創建的一個div中包裹一個button按鈕,同時給button設置了相關屬性和綁定事件
補充:在表格里插入輸入框,在官網上有兩種方法。今天只說一種:

我的代碼
template
<Table border :columns="columns7" :data="data6" width="600"></Table>
{{data6}}
<br />
<button @click="add" type="primary">添加點我啊啊啊啊啊</button>
data
columns7: [
{
title: '姓名',
key: 'name',
render:(h,params) =>{
return h('Input',{
props:{
value:params.row.name,
size:'small'
},
on:{
input:(val) =>{
this.data6[params.index].name = val
}
}
})
}
},
{
title: '年齡',
key: 'age',
render:(h,params)=> {
let b = []
let DataList = [
{
value: '0',
label: '這是0',
},
{
value: '1',
label: '這是1',
},
{
value: '2',
label: '這是2',
},
{
value: '3',
label: '這是3',
}
]
DataList.forEach(item=>{
b.push(h('Option', {
props: {
label: item.label,
value: item.value
},
}, item))
})
return h('Select', {
props: {
// value: this.data6[params.index].age,
label:this.data6[params.index].age,
size:'small',
},
on: {
input: (val) => {
this.data6[params.index].age = val
}
},
}, b)
}
},
{
title:'地址',
key:'address',
render:(h,params) =>{
return h('Input',{
props:{
value:params.row.address,
size:'small'
},
on:{
input:(val) =>{
this.data6[params.index].address = val
}
}
})
}
},
{
title: '操作',
key: 'action',
width: 150,
align: 'center',
render: (h, params) => {
return h('div', [
h('Button', {
props: {
type: 'primary',
size: 'small'
},
style: {
marginRight: '5px'
},
on: {
click: () => {
this.show(params.index)
}
}
}, '看看'),
h('Button', {
props: {
type: 'error',
size: 'small'
},
on: {
click: () => {
this.remove(params.index)
}
}
}, '刪除')
]);
}
}
], data6: [
{
name: 'John Brown',
age: 2,
address: 'New York No. 1 Lake Park'
},
{
name: 'Jim Green',
age: 1,
address: 'London No. 1 Lake Park'
},
{
name: 'Joe Black',
age: '0',
address: 'Sydn12323ey No. 1 Lake Park'
},
{
name: 'Jon Snow',
age: 2,
address: 'Ottawa No. 2 Lake Park'
}
]
method
show (index) {
this.$Modal.info({
title: 'User Info',
content: `Name:${this.data6[index].name}<br>Age:${this.data6[index].age}<br>Address:${this.data6[index].address}`
})
},
add(){
this.data6.push({
name:'',
age:'',
address:'',
})
},
remove (index) {
this.data6.splice(index, 1);
}
