我在将新数据推送到数组时出错

i have got error to push new data to array

我是做树状结构的

我需要添加数据,想删除、编辑、搜索

当我在那个数据存储一个新变量之前将新数据推入一个数组时,我得到了一个 error

TypeError: treeData.push is not a function

如何将该数据设置为新变量以及如何推送数组...

DragandDrop.js:

import React, {
    useState,
    Component,
    useEffect
} from "react";
import 'react-sortable-tree/style.css';
import {
    removeNodeAtPath
} from 'react-sortable-tree';
import SortableTree from 'react-sortable-tree';
import {
    toggleExpandedForAll
} from 'react-sortable-tree';
import './styles.css'


const Treeview = (props, reset) => {
    console.log('props', props)

    const initTreeData = [{
            title: 'Data_1',
            children: [{
                title: "Data_2"
            }]
        },
        {
            title: 'Data_1'
        },
        {
            title: 'Data_2'
        }
    ]
    console.log('test', initTreeData.length)

    var test = {
        index: initTreeData.length + 1,
        title: props.info
    }

    useEffect(() => {
        _fetchGeneral();
    }, [])

    const [treeData, setTreeData] = useState(initTreeData);

    console.log(treeData, "*******")
    if (test.title != '') {
        var m = treeData.push(test)
        // setTreeData(m);
    }

    const _fetchGeneral = async () => {
        setTreeData(initTreeData);
    }

    const updateTreeData = (e) => {
        setTreeData(e);
    }

    // Expand and collapse code 
    const expand = (expanded) => {
        setTreeData(toggleExpandedForAll({
            treeData: treeData,
            expanded,
        }), );
    }

    const expandAll = () => {
        expand(true);
    }

    const collapseAll = () => {
        expand(false);
    }

    // Expand and collapse code  end

    // remove node 
    const removeNode = (rowInfo) => {
        let {
            node,
            treeIndex,
            path
        } = rowInfo;

        setTreeData(removeNodeAtPath({
            treeData: treeData,
            path: path, // You can use path from here
            getNodeKey: ({
                node: TreeNode,
                treeIndex: number
            }) => {
                console.log(number, 'event');
                return (number);
            },
            ignoreCollapsed: false,
        }))
    }

    // remove node end

    return ( <
        div style = {
            {
                display: 'flex',
                flexDirection: 'column',
                height: '100vh'
            }
        } >
        <
        div style = {
            {
                flex: '0 0 auto',
                padding: '0 15px'
            }
        } >
        <
        h3 > Full Node Drag Theme < /h3> <
        button onClick = {
            expandAll
        } > Expand All < /button> <
        button onClick = {
            collapseAll
        } > Collapse All < /button> &
        nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;


        <
        /div>

        <
        div style = {
            {
                flex: '1 0 50%',
                padding: '0 0 0 15px'
            }
        } >
        <
        SortableTree className = "tree-dt"
        id = "add_name"
        treeData = {
            treeData
        }
        onChange = {
            updateTreeData
        }
        generateNodeProps = {
            rowInfo => ({
                buttons: [ <
                    div >
                    <
                    button label = 'Delete'
                    onClick = {
                        () => removeNode(rowInfo)
                    } > X < /button> < /
                    div > ,
                ],
                style: {
                    height: '50px',
                }
            })
        }
        canDrag = {
            ({
                node
            }) => !node.dragDisabled
        }
        /> < /
        div > <
        /div>
    );
}

export default Treeview;

Add.js 文件:

import React, {
    useState
} from 'react';
import {
    TextField
} from '@fluentui/react/lib/TextField';
import {
    DefaultButton,
    PrimaryButton,
    Stack,
    IStackTokens
} from '@fluentui/react';
import './styles.css'


const TextFieldBasicExample = (props) => {
    const [newItemValue, setNewItemValue] = useState({
        title: ''
    });
    console.log('onchange', newItemValue);

    const handleChange = (e) => {
        setNewItemValue({
            [e.target.name]: e.target.value,
        });
    }
    const _insert = (event) => {
        console.log('onclick', newItemValue);
        props.callback(newItemValue);

        // setNewItem({
        //   [event.target.name]:''
        // })
    }

    return ( <
        Stack horizontal >
        <
        Stack className = "add-inp" >

        <
        TextField label = "Add Item"
        name = "title"
        onChange = {
            handleChange
        }
        /> <
        span id = "error_name" > < /span> <
        PrimaryButton text = "Add"
        className = "add-btn"
        onClick = {
            _insert
        }
        />

        <
        /Stack> <
        /Stack>


    );
};

export default TextFieldBasicExample

app.js 文件:

import React, {
    useState,
    Component,
    useEffect
} from "react";
import 'react-sortable-tree/style.css';
import TreeView from "./Drag&Drop";
// import Test from "./Testing";
import AddEdit from "./Add";
import './styles.css'

const Tree = (props) => {
    const [info, setInfo] = useState('');
    const data = (item) => {
        let value = item.title;
        setInfo(value);
    }
    console.log('data', info)
    return ( <
        div >
        <
        div className = "add-dt" >
        <
        div className = "left-side" >
        <`enter code here`
        AddEdit callback = {
            data
        }
        /> <
        /div> <
        div className = "right-side" >
        <
        TreeView info = {
            info
        }
        /> <
        /div> <
        /div> 

        <
        /div>
    );
}

export default Tree;

我假设您遇到此代码段的问题:

    if (test.title != '') {
    var m = treeData.push(test)
    // setTreeData(m);
    }

所以你可以这样做:

if (test.title != '') {
    setTreeData([...treeData, test]);
    }

试试 useState(defaultValues) 或 useState([])