【问题标题】:i have got error to push new data to array我有错误将新数据推送到数组
【发布时间】:2020-12-10 06:12:40
【问题描述】:

我正在做树结构。

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

当我将新数据推送到数组中,然后该数据在该数据中存储了一个新变量时,我遇到了一个错误

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;

添加.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;

【问题讨论】:

    标签: javascript html css reactjs fluent


    【解决方案1】:

    我假设您遇到此代码 sn-p 的问题:

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

    所以你可以这样做:

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

    【讨论】:

    • 我试过这个...但是我又遇到了一个控制台错误...(react-dom.development.js:14815 Uncaught Error: Too many re-renders. React 将渲染次数限制为防止无限循环。)
    • 多调试你的代码,因为这就是我添加项目的方式,它对我来说工作正常。一定是其他原因导致了这个问题。
    • 我在我的 VS 代码中测试了它(只有 treeData 代码),它正确地将数据添加到 treeData
    • 当我在给定输入后单击添加按钮时,我的所有树数据将被隐藏并呈现更多次数组(控制台错误)...
    • 我在控制台中获得了数据...但无法在我的树中显示该数据,并且我的树数据中发生的任何事件都只是在每个事件上新添加更多时间...
    【解决方案2】:

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

    【讨论】:

    • 这段代码我不知道怎么放...你能给我一个详细的例子吗...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多