React:XX 不是一个函数 - 但它是并且它与其他组件一起工作

React: XX is not a function - but it is and it works with other components

我遇到的问题是我无法将值作为 prop 传递给函数,因为它不被识别为函数 - 但它显然是。让我向您展示我的代码。

最高组件 - Treelist

export const TreeList = ( {  treeData, updateSelectedNodeId }) => {

    function updateOfSelectedNode(nodeId) {
        updateSelectedNodeId(nodeId);
    }
  
    return (
        <>
        <div className="row">
          <div className="col text-center">
            <h2>Tree Visualization component</h2>
              <div className="row mt-3 d-flex justify-content-center">
                <div className="col-lg-8 text-left text-dark">
                    {/* <Tree treeData= { treeData } logg = { logger } /> */}
                    <Tree
                    treeData = { treeData }
                    currentNodeIdUpdate = { updateOfSelectedNode }
                    >
                    </Tree>


                </div>
              </div>
          </div>
        </div>
        </>
    )
}

下一个组件 - 树

export const Tree = ( { treeData, currentNodeIdUpdate }) => {

    // const [currentNodeId, setCurrentNodeId] = useState();

    function updateSelectedNodeHandler(nodeId) {
        console.log(`tree : request to approve update of nodeId is : ${nodeId}`);
        console.log(currentNodeIdUpdate);
        currentNodeIdUpdate(nodeId)
    };


    return (
        <div>
            <div className="d-tree">
                <ul className="d-flex d-tree-container flex-column tree-connect">
                    { treeData.map(tree => (
                        <TreeNode node={ tree } updateSelectedNodeId = { updateSelectedNodeHandler  }></TreeNode>
                    ))}
                </ul>

            </div>
            
        </div>
    )
}

Smalles 组件 - Treenode

export const TreeNode = ( { node, updateSelectedNodeId }) => {
    const [childVisible, setChildVisiblity] = useState(false);


    const hasChild = node.children.length > 0 ? true : false;

    const changeVisibility = () => {
        setChildVisiblity( (v) => !v);
    }

    function updateSelectedNode(nodeId) {
        console.log(`update of node id happened: currently at ${nodeId}`);
        updateSelectedNodeId(nodeId);
    }



    return (
        <div className="testA">
        <li className="d-tree-node border-0">
            <div className="d-flex" onClick={changeVisibility}>
                {hasChild && (
                    <div className={`d-inline d-tree-toggler ${childVisible ? "active" : ""}`}>
                    </div>
                )}
                <div className="col d-tree-head">
                    {node.limitGroupName &&
                    <div className="node-tree-card"  onClick={() => updateSelectedNode(node.limitGroupId)}>
                        <p>{node.limitGroupName}</p>
                    </div>
                    }
                    
                </div>
            </div>

            {/* {hasChild && childVisible && ( */}
            {true && true && (
                <div className="d-flex d-tree-content">
                    <ul className="d-flex d-tree-container flex-column tree-connect">
                        <Tree treeData={node.children} />
                    </ul>
                </div>
                )
            }
        </li>
        </div>
    );
}

如您所见,我始终使用函数并将它们作为 props 从最高组件 (Treelist) 传递到最低组件 (treenode)。如果选择了一个Treenode,我想将各自节点的ID传回给最高的组件。

但是,如果我尝试对此进行测试,我会收到错误消息,即 currentNodeIdUpdate in Tree 不是函数。然而,它显然是,正如您在 TreeList 中看到的那样。

我错过了什么? 在这个问题上坐了几个小时...

非常感谢。

TreeNode 组件中,您正在渲染 Tree

<Tree treeData={node.children} />

但是 Tree 组件需要第二个名为 currentNodeIdUpdate 的属性,它应该是函数。

在这种情况下,它是未定义的;

如果您在 Tree 组件中添加检查,应该可以解决问题。

类似于:

function updateSelectedNodeHandler(nodeId) {
    console.log(`tree : request to approve update of nodeId is : ${nodeId}`);
    console.log(currentNodeIdUpdate);

    if(currentNodeIdUpdate) {
      currentNodeIdUpdate(nodeId)
    }
};