vue render 嵌套 iview Poptip 及on-ok事件

本文介绍了一种在表格中实现编辑和删除操作的方法,通过使用Button和Poptip组件,实现了行级别的操作功能,包括确认删除对话框,提供更好的用户体验。
columns4: [
  {
    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.modalShow(params.index)
          }
        }
        }, '编辑'),
        h('Poptip', {
          style:{
            textAlign: 'left'
          },
          props: {
            placement:'left-start',
            confirm: true,
            title: '确定删除吗?',
          },
          on: {
            // 必须是箭头函数写法
            'on-ok': ()=> {
              //调用删除方法
              this.remove(params.index)
                console.log('删除')
            },
            'on-cancel': ()=> {
                console.log('取消')
            }
          }
        },[
          h('Button', {
            props: {
              type: 'error',
              size: 'small'
            },
            on: {
              click: () => {
                //this.remove(params.index)
              }
            }
          }, '删除')
        ]),
      ]);
    }
  }
],
 

 

<think>我们正在使用IView的Table组件,并在其列的render函数中希望使用Element UI的组件。 由于IView和Element UI都是Vue的UI库,它们可以共存于同一个项目中。但是,在render函数中使用Element UI组件需要特别注意以下几点: 1. 确保已经正确安装和注册了Element UI组件(在main.js中或局部注册)。 2. 在render函数中,使用h函数创建Element UI组件,就像创建普通Vue组件一样。 3. 传递props、事件监听等与使用IView组件类似。 步骤: 1. 确保项目已经安装Element UI,并在main.js中引入(或按需引入)并注册。 2. 在需要使用Element UI组件Vue组件中,不需要额外导入(因为已经全局注册)或者按需导入并注册到当前组件的components中(如果使用局部注册)。 3. 在IView表格列的render函数中,使用h函数来创建Element UI组件。 示例:在IView表格的render函数中使用Element UI的Button和Tooltip组件。 注意:由于两个库的样式可能会冲突,需要做好样式管理。 具体代码示例: 假设我们已经在项目中同时引入了IView和Element UI(全局注册)。 在表格列的render函数中,我们可以这样写: ```javascript { title: '操作', key: 'action', width: 200, render: (h, params) => { // 使用Element UI的el-button组件 return h('div', [ h('el-button', { props: { type: 'primary', size: 'mini' }, on: { click: () => { this.handleEdit(params.row); } } }, '编辑'), h('el-tooltip', { props: { content: '删除这条记录', placement: 'top' } }, [ h('el-button', { props: { type: 'danger', size: 'mini' }, style: { marginLeft: '10px' }, on: { click: () => { this.handleDelete(params.row); } } }, '删除') ]) ]); } } ``` 说明: - 使用h函数创建Element UI组件时,第一个参数是组件的标签名(如'el-button'),注意标签名要与注册的组件名一致。 - 第二个参数是一个对象,用于配置组件的属性(props)、事件on)、样式(style)等。 - 第三个参数是子节点,可以是文本字符串,也可以是其他由h函数创建的节点数组。 注意事项: 1. 如果Element UI组件是局部注册的,那么在render函数中无法直接使用,因为render函数无法访问当前组件的components选项。因此,建议全局注册Element UI组件,或者在需要使用的组件中,将Element UI组件作为局部组件导入并注册到当前组件的components中,然后在render函数中通过h函数使用注册的组件选项对象(而不是字符串标签名)来创建组件。 例如,局部注册: ```javascript import { ElButton, ElTooltip } from 'element-ui'; export default { components: { ElButton, ElTooltip }, // ... 其他选项 } ``` 然后在render函数中: ```javascript render: (h, params) => { return h('div', [ h(ElButton, { ... }, '编辑'), // 注意这里直接使用变量ElButton,而不是字符串 // ... ]); } ``` 2. 样式冲突:两个UI库的样式可能会相互影响,需要仔细检查。可以使用scoped样式或者自定义类名来避免冲突。 3. 按需引入:如果使用按需引入,确保在需要的地方都引入了相应的组件。 总结:在IViewrender函数中使用Element UI组件是可行的,但需要注意组件的注册方式和样式问题。根据项目实际情况选择全局注册或局部注册,并在render函数中正确使用h函数创建组件。</think>### 在 IView 表格 Render 函数中使用 Element UI 组件Vue 项目中同时使用 IView 和 Element UI 时,可以在 IView 表格的 render 函数中引入 Element UI 组件。以下是具体实现步骤: #### 步骤 1: 全局注册 Element UI 组件 在 `main.js` 中全局注册 Element UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' // 引入 IView import ViewUI from 'view-design' import 'view-design/dist/styles/iview.css' Vue.use(ElementUI) Vue.use(ViewUI) ``` #### 步骤 2: 在 Render 函数中使用 Element UI 组件IView 表格列的 render 函数中,通过 `h()` 函数创建 Element UI 组件: ```javascript export default { data() { return { columns: [ { title: '姓名', key: 'name' }, { title: '操作', render: (h, params) => { return h('div', [ // 使用 Element UI 的按钮组件 h( 'el-button', { props: { type: 'primary', size: 'mini' }, on: { click: () => this.handleEdit(params.row) } }, '编辑' ), // 使用 Element UI 的提示组件 h( 'el-tooltip', { props: { content: '删除数据', placement: 'top' } }, [ h( 'el-button', { props: { type: 'danger', size: 'mini' }, style: { marginLeft: '10px' }, on: { click: () => this.handleDelete(params.row) } }, '删除' ) ] ) ]) } } ], data: [{ id: 1, name: '张三' }] } }, methods: { handleEdit(row) { console.log('编辑行:', row) }, handleDelete(row) { console.log('删除行:', row) } } } ``` #### 关键实现技巧 1. **组件名称规范**: - 使用 Element UI 的组件标签名(如 `'el-button'`, `'el-tooltip'`) - IView 组件保持使用 PascalCase 命名(如 `Button`) 2. **样式隔离**: ```css /* 在组件样式中添加命名空间 */ .iview-table-wrapper .el-button { margin-right: 8px; } ``` 3. **事件绑定**: ```javascript on: { click: () => this.methodName(params.row) } ``` 4. **嵌套组件**: ```javascript // Element UI 的 Tooltip 包裹 Button h('el-tooltip', { props: { content: '提示信息' } }, [ h('el-button', { ... }, '按钮文本') ]) ``` #### 完整组件示例 ```vue <template> <Table :columns="columns" :data="data"></Table> </template> <script> export default { data() { return { columns: [ { title: 'ID', key: 'id' }, { title: '产品', key: 'product' }, { title: '状态', render: (h, params) => { // 使用 Element UI 的标签组件 return h('el-tag', { props: { type: params.row.status === 1 ? 'success' : 'danger' } }, params.row.status === 1 ? '启用' : '禁用') } }, { title: '操作', render: (h, params) => { return h('div', [ h('el-button', { props: { icon: 'el-icon-edit', size: 'mini' }, on: { click: () => this.editItem(params.row) } }), h('el-popconfirm', { props: { title: '确定删除吗?' }, on: { onConfirm: () => this.deleteItem(params.row) } }, [ h('el-button', { slot: 'reference', props: { icon: 'el-icon-delete', size: 'mini', type: 'danger' }, style: { marginLeft: '10px' } }) ]) ]) } } ], data: [ { id: 1, product: '手机', status: 1 }, { id: 2, product: '电脑', status: 0 } ] } }, methods: { editItem(row) { this.$message.success(`编辑产品: ${row.product}`) }, deleteItem(row) { this.$message.error(`删除产品: ${row.product}`) } } } </script> <style scoped> /* 添加命名空间避免样式冲突 */ :deep(.iview-table-cell) .el-button { vertical-align: baseline; } </style> ``` #### 注意事项 1. **组件冲突**: - 两个库的同名组件(如 `Button`)可能冲突 - 解决方案: ```javascript // 使用完整组件名 h('el-button') // Element UI h('Button') // IView ``` 2. **按需引入**: 如果使用按需加载,需在组件内单独引入: ```javascript import { ElButton, ElTooltip } from 'element-ui' export default { components: { ElButton, ElTooltip } } ``` 3. **版本兼容**: - IView ≥ 4.0 (View UI) - Element UI ≥ 2.0 通过这种方式,可以在保持 IView 表格核心功能的同时,灵活使用 Element UI 的交互组件,结合两者的优势实现更丰富的界面效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值