循环渲染对比、结合jsx

一、table表格循环渲染

1.vue2.0中循环渲染表格并加 插槽

(1)将<el-table-column>标签的属性定义为一个数组columns,循环渲染数据。
(2)由于v-for和v-if不能作用在同一标签上,所以要用<template>包裹所有的<el-table-column>。
(3)循环渲染<<el-table-column>标签,并将需要添加插槽的单独领出来。

    <el-table :data="tableData">
      <!-- 用template包裹table-column,不要把v-for和v-if写到一个标签上 -->
      <template v-for="item in columns" :key="item.prop">
        <!-- 如果是要加插槽的需要单独判断 -->
        <el-table-column
          v-if="item.prop==='name'"
          :width="item.width"
          :label="item.label"
          :align="item.align"
        >
          <template v-slot="{row}">
            <div>
              {{row.name}}hahah
            </div>
          </template>
        </el-table-column>
        <!-- 不加插槽的循环渲染 -->
        <el-table-column
          v-else
          :prop="item.prop"
          :width="item.width"
          :label="item.label"
          :align="item.align"
        >
        </el-table-column>
      </template>
    </el-table>

const columns = [
  {
    prop: 'id',
    width: 120,
    label: 'ID',
    align: 'center',
  },
  {
    prop: 'name',
    width: 180,
    label: '机构名称',
  },
];

或者简单来写:

       <el-table-column
          v-for="item in columns"
          :key="item.prop"
          :prop="item.prop"
          :width="item.width"
          :label="item.label"
          :align="item.align"
          :sortable="item.sortable"
        >
          <template v-slot="{row}" v-if="item.prop==='name'">
            <div>
              这是自定义name:{{row.name}}
            </div>
          </template>
          <template v-slot="{row}" v-else-if="item.prop==='id'">
            <div>
              这是自定义id: {{row.id}}
            </div>
          </template>
        </el-table-column>
2.vue3.0结合jsx表格渲染 与 插槽的使用

(1)使用jsx语法,在<el-table>标签内调用一个函数,函数返回值是<el-table-column>结构。
(2)遍历定义好的colums数组,循环渲染<el-table-columns>标签。
(3)可以在<el-table-columns>标签的HTML结构中使用jsx语法,判断是否需要添加插槽。
(4)使用jsx语法添加插槽,插槽内容是一个回调函数,函数返回值是要渲染的HTML结构,函数参数可以将当前行的数据传递给HTML结构。
(5)函数返回值是一个函数子组件。

首先,在<el-table>标签内放入一个函数,返回值就是<el-table-column>结构

        <el-table
          data={tableList}
          row-key="id"
        >
          {columnList()}
        </el-table>

遍历columns循环渲染<el-table-column>,并区分哪些标签需要插槽

    const columnList = () => {
      return column.map((item) => (
        ['basic', 'account', 'org', 'dataScope', 'time'].includes(item.prop) ? 
        <el-table-column
            prop={item.prop} 
            width={item.width} 
            label={item.label} key={item.prop} 
            v-slots={(scope) => <ColumnItem prop={item.prop} {...scope.row}/>}
         />
          : 
          <el-table-column prop={item.prop} label={item.label} key={item.prop} align={item.align} />
      ));
    };

最后插槽使用函数子组件进行渲染

const ColumnItem = (props) => {
  return <div>{props.prop}</div>;
}; 

二、vue3结合jsx

1.render()函数中使用this
2.插槽的使用注意点

(1)自定义插槽:如表格中的某列需要自定义内容

① 用v-slots指定插槽内容,值为一个 函数。
② 函数的 参数 是当前列的所有数据 scope,函数 返回值 是一个 函数式组件。

<el-table-column v-slots={(scope) => <ColumnItem prop={item.prop} {...scope.row}/>
const ColumnItem = (props) => {
  return <div>{props.prop}</div>;
}; 

③ <el-table-column />标签可能是循环渲染的,因为每一列都有对应的 prop属性;也有可能是单独写的,比如最后一列的操作项。

              <el-table data={state.tableData} v-slots={state.tableSlots} onSortChange={sortChange} ref="tableRef">
                {initColumns()}
                <el-table-column label='操作' v-slots={(scope) => action(scope)}></el-table-column>
              </el-table>
    // 表格操作栏插槽
    const action = (scope) => 
<span className='button-link' style={{ cursor: 'pointer' }} onClick={() => actionHistory(scope)}>操作记录</span>;

(2)有名字的插槽:如input框通过append插槽,添加后缀内容

① 用v-slots指定插槽内容,值为一个 对象。
② key是插槽名,value是一个函数,函数返回值就是插槽内容。

<el-input v-slots={slots} />
    const slots = {
      append: () => '.com',
    };
3. vue3结合jsx时的数据绑定

v-model绑定数据时用 "state.xxx" 的形式,不要直接 v-model={xxx} ,否则可能会出现数据无法实现双向绑定的bug。

                <el-radio-group v-model={state.timeRadio} size="large" onChange={timeChange}>
                  <el-radio-button label='1' >近30天</el-radio-button>
                  <el-radio-button label='2' >近7天</el-radio-button>
                </el-radio-group>
4. 在jsx中使用props数据

1.setup()函数要接收props参数。
2.setup()函数要在return 中将props返回。
3.render()函数中在this中接收props。

5. 类名

1.在vue中使用jsx时,类名用class 和 className 都不会 报错,但是 className可能不生效。
2.为单个元素添加多类名:<img className={tree-item ${item.id === state.orgId ? 'activeTreeItem' : ''}} />

6.vue 结合 jsx 的动态表单校验

(1)动态生成的表单的 校验规则 rules属性,要单独写到<el-form-item>标签上。
(2)重点是 prop属性,有特殊写法。

① 其中,state.followForm 是<el-form>绑定的表单对象。
state.followForm.url是一个数组,用来存放动态生成的链接地址,数组元素就是 字符串。
prop属性直接用 数组名 url(字符串) 加上 .index(动态索引)

const state = reactive({
   followForm: {
     url: ['', ''], // 存放链接的数组,初始默认有两个输入框
   },
})
<el-form model={state.followForm}>
 {
    state.followForm.url.map((item, index) => (
        <el-form-item 
           label="数据链接:"
           prop={`url.${index}`}  // 1.注意prop属性的写法。
           rules={{ required: true, message: '请输入数据链接并以http开头', trigger: 'blur' }}  // 2.校验规则单独写。
         >
            <el-input
               v-model={state.followForm.url[index]} // 3.注意input框数据的绑定。
               onBlur={() => limitUrl(index)}
            />
         </el-form-item>
     ))
  }
</el-form>
7.vue结合jsx不再分<template></template>、<script></script>、<style></style>标签。
import { defineComponent, reactive,  getCurrentInstance,} from 'vue';
import './index.scss';

export default defineComponent({
  setup() {
    const { proxy } = getCurrentInstance();
    const state = reactive({
      activeKey: 0, // 一级tab栏
    });
    // 一级tab栏切换
    const topTabsClick = (key, e) => { };
    return {
      state,
      typeChange,
    };
  },
  render() {
    const { state,typeChange } = this;
    return (
      <div className="data-analyse-wrapper" >
        <div class="yc-first-tabs">
          <div onClick={(e) => topTabsClick(0, e)}> 普通机构 </div>
        </div>
      </div>
    );
  },
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容