iView的树的render函数渲染-多选框、图标、图片

iView的树的render函数渲染

官网:渲染函数& JSX

{
	// 与 `v-bind:class` 的 API 相同,
	// 接受一个字符串、对象或字符串和对象组成的数组
 'class': {
   foo: true,
   bar: false
 },
 // 与 `v-bind:style` 的 API 相同,
 // 接受一个字符串、对象,或对象组成的数组
 style: {
   color: 'red',
   fontSize: '14px'
 },
 // 普通的 HTML attribute
 attrs: {
   id: 'foo'
 },
 // 组件 prop
 props: {
   myProp: 'bar'
 },
 // DOM property
 domProps: {
   innerHTML: 'baz'
 },
 // 事件监听器在 `on` 内,
 // 但不再支持如 `v-on:keyup.enter` 这样的修饰器。
 // 需要在处理函数中手动检查 keyCode。
 on: {
   click: this.clickHandler
 },
 // 仅用于组件,用于监听原生事件,而不是组件内部使用
 // `vm.$emit` 触发的事件。
 nativeOn: {
   click: this.nativeClickHandler
 },
 // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
 // 赋值,因为 Vue 已经自动为你进行了同步。
 directives: [
   {
     name: 'my-custom-directive',
     value: '2',
     expression: '1 + 1',
     arg: 'foo',
     modifiers: {
       bar: true
     }
   }
 ],
 // 作用域插槽的格式为
 // { name: props => VNode | Array<VNode> }
 scopedSlots: {
   default: props => createElement('span', props.text)
 },
 // 如果组件是其它组件的子组件,需为插槽指定名称
 slot: 'name-of-slot',
 // 其它特殊顶层 property
 key: 'myKey',
 ref: 'myRef',
 // 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
 // 那么 `$refs.myRef` 会变成一个数组。
 refInFor: true
}

使用强大的 Render 函数可以自定义节点显示内容和交互,比如添加图标,按钮等。

Render 函数的第二个参数,包含三个字段:

  • root :树的根节点
  • node :当前节点
  • data :当前节点的数据

通过合理地使用 root、node 和 data 可以实现各种效果,其中,iView 给每个节点都设置了一个 nodeKey 字段,用来标识节点的 id。

两种写法:

Render 函数分两种,一种是给当前树的每个节点都设置同样的渲染内容,此 render 通过 Tree 组件的属性 render 传递;另一种是单独给某个节点设置,在该节点的 render 字段内设置;同时设置时,会优先使用当前节点的 Render 函数。

写法一:

代码:

最简单的写法

在树中绑定render函数

<template>
  <Tree
    ref="tree"
    :data="data"
    :render="renderContent"
    class="demo-tree-render"
  ></Tree>
</template>
<script>
export default {
  data() {
    return {
      data: [
        {
          title: "parent 1",
          expand: true,
          children: [
            {
              title: "parent 1-1",
              expand: true,
              children: [
                {
                  title: "leaf 1-1-1",
                  primaryKey: 11,
                  checkbox: true,
                  checked: true,
                },
                {
                  title: "leaf 1-1-2",
                  primaryKey: 12,
                  checkbox: true,
                  checked: false,
                },
                {
                  title: "leaf 1-1-3",
                  primaryKey: 13,
                  checkbox: true,
                  checked: true,
                },
              ],
            },
            {
              title: "parent 1-2",
              expand: true,
              children: [
                {
                  title: "leaf 1-2-1",
                  primaryKey: 21,
                  checkbox: true,
                  checked: false,
                },
                {
                  title: "leaf 1-2-2",
                  primaryKey: 22,
                  checkbox: true,
                  checked: false,
                },
              ],
            },
          ],
        },
      ],
    };
  },

  methods: {
    renderContent(h, { root, node, data }) {
      return h('span', data.title)
    },
  },
};
</script>
<style>
</style>

写法二:

代码:

render属性

<template>
  <Tree
    ref="tree"
    :data="data1"
  >
  </Tree>
</template>
<script>
export default {
  data() {
    return {
      data1: [],
      data: [
        {
          title: "parent 1",
          expand: true,
          img: "./../static/img/1.jpg",
          text: "number one",
          children: [
            {
              title: "child 1-1",
              expand: true,
              img: "./../static/img/1.jpg",
              text: "number two",
              children: [
                {
                  title: "leaf 1-1-1",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number three",
                  checkbox: true,
                },
                {
                  title: "leaf 1-1-2",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number four",
                  checkbox: true,
                },
              ],
            },
            {
              title: "child 1-2",
              expand: true,
              img: "./../static/img/1.jpg",
              text: "number five",
              children: [
                {
                  title: "leaf 1-2-1",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number six",
                  checkbox: true,
                },
                {
                  title: "leaf 1-2-2",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number seven",
                  checkbox: true,
                },
              ],
            },
          ],
        },
      ],
    };
  },

  methods: {
    createTree() {
      this.data1 = this.data;
      this.createTree2(this.data1);
    },
    createTree2(data) {
      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h('span', ele.title)
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });
    },

    
  },
  mounted() {
    this.createTree();
  },
};
</script>

<style>
.ivu-tree .ivu-icon {
  color: aquamarine;
}
</style>

改造

以写法二改造:

Tree渲染叶节点多选框

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h("span", [
            h("Checkbox", {
              attrs: {
                value: data.checked,
              },
              on: {
                "on-change": (event) => {
                  console.log(event);
                },
              },
            }),
            [h("span", data.title)],
          ]);
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });

效果图:

请添加图片描述

Tree渲染三级叶节点多选框

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          if (ele.checkbox) {
            return h(
              "span",
              {
                style: {
                  display: "inline-block",
                  width: "200px",
                },
              },
              [
                h(
                  "checkbox",
                  {
                    style: {
                      display: "inline-block",
                      marginLeft: "8px",
                    },
                  },
                  [h("span", data.title)]
                ),
              ]
            );
          } else {
            return h(
              "span",
              {
                style: {
                  display: "inline-block",
                },
              },
              [h("span", data.title)]
            );
          }
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });

效果图:

请添加图片描述

Tree渲染叶节点-图片

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h(
            "span",
            {
              style: {
                display: "inline-block",
              },
            },
            [
              h("img", {
                attrs: {
                  src: data.img,
                  style: "width: 20px; height: 20px",
                },
              }),
              [h("span", data.title)],
            ]
          );
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });

效果图:
在这里插入图片描述

Tree渲染叶节点-Tooltip文字提示

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h(
            "Tooltip",
            {
              props: {
                placement: "right-start",
                transfer: true,
              },
            },
            [
              data.title,
              h(
                "span",
                {
                  slot: "content",
                  style: {
                    whiteSpace: "normal",
                  },
                },
                data.text
              ),
            ]
          );
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });

效果图:

请添加图片描述

Tree渲染叶节点-Icon图标

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h("span", [
            h("Icon", {
              props: {
                type: "ios-chatbubbles",
                size: 12,
              },
            }),
            h('span', ele.title)
          ]);
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });

效果图:

请添加图片描述

Tree渲染叶节点-Button按钮

      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          return h("span", [
            h(
              "Button",
              {
                props: {
                  type: "primary",
                },
                on: {
                  click: (event) => {
                    console.log("点我了!");
                  },
                },
              },
              [h("span", data.title)]
            ),
          ]);

效果图:

请添加图片描述
其他的类似改造就好了

综合-结合多选、树(Tree)的方法

请添加图片描述

<template>
  <Tree ref="tree" :data="data1"> </Tree>
</template>
<script>
import Vue from "vue";
export default {
  data() {
    return {
      data1: [],
      data: [
        {
          title: "parent 1",
          expand: true,
          img: "./../static/img/1.jpg",
          text: "number one",
          children: [
            {
              title: "child 1-1",
              expand: true,
              img: "./../static/img/1.jpg",
              text: "number two",
              children: [
                {
                  title: "leaf 1-1-1",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number three",
                  checkbox: true,
                  checked: true,
                },
                {
                  title: "leaf 1-1-2",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number four",
                  checkbox: true,
                  checked: false,
                },
              ],
            },
            {
              title: "child 1-2",
              expand: true,
              img: "./../static/img/1.jpg",
              text: "number five",
              children: [
                {
                  title: "leaf 1-2-1",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number six",
                  checkbox: true,
                  checked: true,
                },
                {
                  title: "leaf 1-2-2",
                  expand: true,
                  img: "./../static/img/1.jpg",
                  text: "number seven",
                  checkbox: true,
                  checked: false,
                },
              ],
            },
          ],
        },
      ],
    };
  },

  methods: {
    createTree() {
      this.data1 = this.data;
      this.data1.forEach((ele) => {
        console.log(ele, ele.checked);
        if (ele.checked) {
          this.$refs.tree.node.checked = true;
        }
      });
      this.createTree2(this.data1);
    },
    createTree2(data) {
      data.forEach((ele) => {
        ele.render = (h, { root, node, data }) => {
          if (ele.checkbox) {
            return h(
              "span",
              {
                style: {
                  display: "inline-block",
                  width: "200px",
                },
              },
              [
                h(
                  "Checkbox",
                  {
                    attrs: {
                      value: ele.checked,
                    },
                    style: {
                      display: "inline-block",
                      marginLeft: "8px",
                    },
                    on: {
                      "on-change": (event) => {
                        this.getChooceCheckbox(this.data1, ele, event);
                      },
                    },
                  },
                  [h("span", data.title)]
                ),
              ]
            );
          } else {
            return h(
              "span",
              {
                style: {
                  display: "inline-block",
                },
              },
              [h("span", data.title)]
            );
          }
        };
        if (ele.children && ele.children.length > 0) {
          this.createTree2(ele.children);
        }
      });
    },
    getChooceCheckbox(data, node, event) {
      let getCheckNode = this.$refs.tree.getCheckedNodes(); //获得已勾选节点
      console.log(getCheckNode);
      data.forEach((ele) => {
        if (ele == node) {
            console.log( 11,ele.checked);
          if (ele.checked) {
              console.log(ele.checked);
            Vue.set(ele, "checked", false);
          } else {
            Vue.set(ele, "checked", true);
          }
        }
        if (ele.children && ele.children.length > 0) {
          Vue.set(ele, "checked", false);
          this.getChooceCheckbox(ele.children,node);
        }
      });
    },
  },
  mounted() {
    this.createTree();
  },
};
</script>

<style>
.ivu-tree .ivu-icon {
  color: aquamarine;
}
</style>
      let getCheckNode = this.$refs.tree.getCheckedNodes(); //获得已勾选节点
      console.log(getCheckNode);

获取到的数据:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值