当前位置:   article > 正文

antd Tree 获取当前节点以及所有上级父节点的id_antd/es/tree组件传输父级节点id

antd/es/tree组件传输父级节点id

项目需求:一个产品树,当点击一个节点的时候获取当前节点以及所有父级节点的id,并调用兄弟组件(form组件)的方法进行查询操作,查询的结果需要渲染在table组件中。

1.首先明确这个页面的组件结构,是由 Tree、Form、Table组件组成。

  1. // index.js 父组件
  2. <Card bordered={false} title="商品SPU列表" className={style.antCardBox}>
  3. <div className={style.antTreeBox}>
  4. <OrderTree/>
  5. </div>
  6. <div style={{ flex: '1' }}>
  7. <OrderForm />
  8. <OrderTable />
  9. </div>
  10. </Card>

来看下页面渲染结果,使用flex布局,左边Tree组件宽度固定,右边自适应剩余空间。同时Tree中节点文字过长会省略号...展示,并且鼠标悬浮提示全部内容。

css样式:

  1. .antCardBox {
  2. :global {
  3. .ant-card-body {
  4. display: flex !important;
  5. }
  6. }
  7. }
  8. .antTreeBox {
  9. width: 250px;
  10. margin-right: 30px;
  11. box-shadow: 3px -3px 6px 0px #ccc6;
  12. :global {
  13. .ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected {
  14. background-color: #50d38c !important;
  15. color: white;
  16. }
  17. .ant-tree.ant-tree-icon-hide {
  18. max-height: 900px !important;
  19. overflow: auto !important;
  20. }
  21. .ant-tree-title {
  22. overflow: hidden;
  23. text-overflow: ellipsis;
  24. white-space: nowrap;
  25. display: inline-block;
  26. width: 170px;
  27. }
  28. .ant-spin.ant-spin-spinning {
  29. margin-top: 30%;
  30. }
  31. }
  32. }

2.明确要解决的问题有以下2个:

  • 如何在点击树节点的时候获取当前节点以及所有父级节点的id?
  • Tree组件获取到id后如何执行Form组件中的查询方法?

如何在点击树节点的时候获取当前节点以及所有父级节点的id?

解决方法:就是对从后台获取的数据进行递归遍历获取所需要的key和value。

  1. let keysObj = {}; // 当前节点以及所有父节点的id
  2. const intetorFun = (data, key, string) => {
  3. if (string) {
  4. firstParentKey = {
  5. [data.param]: data.paramId,
  6. };
  7. }
  8. if (data.children && data.children.length !== 0) {
  9. data.children.forEach(item => {
  10. if (item.id === key[0]) {
  11. keysObj = {
  12. [data.param]: data.paramId,
  13. [item.param]: item.paramId,
  14. ...firstParentKey,
  15. };
  16. } else {
  17. intetorFun(item, key);
  18. }
  19. });
  20. }
  21. return keysObj;
  22. };
  23. const getParentKey = (key, treeData) => {
  24. let parentKey = [];
  25. for (let i = 0; i < treeData.length; i++) {
  26. const node = treeData[i];
  27. // ‘firstTime’是设置的一个标记,根据这个标记把一级父节点的id记录在firstParentKey中
  28. parentKey = intetorFun(node, key, 'firstTime');
  29. }
  30. return parentKey;
  31. };

Tree组件获取到id后如何执行Form组件中的查询方法?

调用Form组件的查询方法需要在他们的父组件中进行操作,要在父组件中获取Tree和Form组件的实例,通过实例调用方法。

  1. // index.js 父组件
  2. onRef = ref => {
  3. this.orderForm = ref; //获取Form组件的实例
  4. };
  5. treeRef = ref => {
  6. this.orderTree = ref; //获取Tree组件的实例
  7. };
  8. getIdObject = data => {
  9. this.setState({idObject: data},() => {
  10. // 在Form组件中根据点击的树节点id,回填类型下拉选择框
  11. this.orderForm.props.form.setFieldsValue({
  12. categoryIds: [String(data.categoryId)],
  13. });
  14. // 调用Form组件的查询方法
  15. this.orderForm.inquery(data);
  16. });
  17. };
  18. <Card bordered={false} title="商品SPU列表" className={style.antCardBox}>
  19. <div className={style.antTreeBox}>
  20. <OrderTree idObject={this.getIdObject} treeRef={this.treeRef} />
  21. </div>
  22. <div style={{ flex: '1' }}>
  23. <OrderForm onRef={this.onRef} isReact={this.isReact} />
  24. <OrderTable />
  25. </div>
  26. </Card>
  27. // 在Tree和Form组件中在componentDidMount生命周期中把自己传给父组件
  28. // Tree组件中
  29. componentDidMount() {
  30. this.props.treeRef && this.props.treeRef(this);
  31. }
  32. // 在点击树节点的时候
  33. //点击树节点时触发
  34. onSelect = (selectKeys, e) => {
  35. const { dispatch } = this.props;
  36. const {
  37. commodity: { treeData },
  38. } = this.props;
  39. this.setState({
  40. selectedKeys: selectKeys,
  41. });
  42. let arrKeys = {};
  43. //只有节点选中了才执行代码
  44. if (e.selected && e.node.props.dataRef.param !== 'categoryId') {
  45. keysObj = {};
  46. firstParentKey = {};
  47. arrKeys = getParentKey(selectKeys, treeData);
  48. } else if (e.selected && e.node.props.dataRef.param === 'categoryId') { //点击的是一级根节点
  49. keysObj = {};
  50. firstParentKey = {};
  51. arrKeys = {
  52. categoryId: e.node.props.dataRef.paramId,
  53. };
  54. } else if (!e.selected) {
  55. this.setState({
  56. selectedKeys: [],
  57. });
  58. return false;
  59. }
  60. this.props.idObject(arrKeys); // 将获取到的所有父级id传给父组件
  61. };
  62. // Form组件中
  63. componentDidMount() {
  64. this.props.onRef && this.props.onRef(this);
  65. }

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/106740
推荐阅读