美文网首页
react相关报错解决

react相关报错解决

作者: sweetBoy_9126 | 来源:发表于2019-11-12 17:34 被阅读0次
    1. 渲染一个数组的时候,如果直接渲染会报错说我们缺少key
      Each child in a list should have a unique "key" prop
      解决方法:对数组遍历克隆每一个元素,给每个元素加一个key
    <Dialog buttons={
            [
              <Button type="primary" size="mini" onClick={() => setX(false)}>ok</Button>,
              <Button size="mini" onClick={() => setX(false)}>cancel</Button>
            ]
          }>
            小改改!
    </Dialog>
    

    使用

    <div>
    {props.buttons.map((button, index) => {
         return React.cloneElement(button, {key: index})
    })}
    </div>
    
    1. 如果我们要在在一个函数的参数里调用这个函数的返回结果,这时候我们如果直接写的话,会说我们不能在声明前使用
    const x = (a) => {
      const fn = () => {}
      return fn
    }
    const y = x(<button onClick={y}>会报错</button>)
    

    解决方法通过你个箭头函数延迟获取y

    const y = x(<button onClick={() => y()}>会报错</button>)
    
    1. 不能直接在 map 里使用 useState,可以把map里的内容单独封装一个组件,在这个组件顶层使用 useState

    上面的代码直接在map里使用了 useState,这样一旦你对数组数据进行 添加或者删除,每次的索引对应不上就会报错,所以把map里的内容单独拿出来

    1. 报错:Objects are not valid as a React child ... If you meant to render a collection of children, use an array instead.
      这种问题的原因是我们把一个普通的对象作为了React 的子元素,引起这种问题的原因可能是我们使用 JSON.parse(JSON.stringify(menus)) 深拷贝的原因,它会把我们的 Dom 对象拷贝成普通对象,如果非要深拷贝我们可以使用 loadash
      以下面的 Tree 组件为例
    const handleTree = (
      treeData: any[],
      titleName: string = 'name',
      valueName: string = 'dept_id',
    ) => {
      treeData.forEach((item: any) => {
        item.title = <span style={{color: item.isSensitive === 1 ? 'red' : 'rgba(0, 0, 0, 0.65)'}}>{item[titleName] || item.ding_name || item.label}</span>;
        item.value = item[valueName] || item.ding_id || item.value;
        item.key = item[valueName] || item.ding_id || item.value;
    
        if (item.particle) {
          item.children = item.particle;
        }
    
        const new_data = [...(item.user || []), ...(item.children || [])];
        item.children = new_data;
        handleTree(item.children, titleName, valueName);
      });
    };
    
     <Tree
              treeData={getShowList(treeData, value)}
              expandedKeys={expandedValueKeys}
              onExpand={setExpandedValueKeys}
              selectable={false}
              defaultExpandAll
            />
    
    export function getShowList(menus: TreeNodeNormal[], keys: string[]) {
      const fibJudge = (item: TreeNodeNormal): boolean => {
        const { children = [] } = item;
        if (children.length) {
          return children.some(sub => fibJudge(sub)) || keys?.indexOf(`${item.key}`) > -1;
        }
        return keys?.indexOf(`${item.key}`) > -1;
      };
      const fibArr = (arrs: TreeNodeNormal[]) => {
        const filteredArr: TreeNodeNormal[] = [...arrs].filter(item => fibJudge(item));
        return filteredArr?.map((item: TreeNodeNormal) => {
          if (item?.children?.length) {
            item.children = fibArr(item?.children || []);
          }
          return item;
        });
      };
      return fibArr(cloneDeep(menus));
    }
    
    

    我们原来的 title 是一个 react element,但如果我们用JOSN深拷贝它就会变成下面的普通对象

    相关文章

      网友评论

          本文标题:react相关报错解决

          本文链接:https://www.haomeiwen.com/subject/ytmqictx.html