【问题标题】:Update table without refreshing after adding an item in reactjs在reactjs中添加项目后更新表而不刷新
【发布时间】:2021-04-04 12:17:27
【问题描述】:

我正在用 react.Js 开发一个应用程序

我有一个表格,我需要更新而无需刷新页面。

代码:

const App = () => {
    const [item, setItem] = useState([])
    const [category, setCategory] = useState([])

    const categories = category.map(elem => ({
        value: elem.id,
        label: elem.cat,
    }));

    const [category_select, setCategorySelect] = React.useState(null);

    function handleChangeCategory(value) {
        setCategorySelect(value);
    }

    useEffect(() => {
        getItems()
    }, [])

    useEffect(() => {
        getCategories()
    }, [])

    const getItems = async () => {
        const response = await axios.get(REQUEST_1)
        setItem(response.data)
    }

    const getCategories = async () => {
        const response = await axios.get(REQUEST_2)
        setCategory(response.data)
    }

    const addItems = () => {
        axios.post(`${REQUEST_1}`, {cat: category_select.value});
    };

    const body = () => {
        return item && item.map((elem,j) => {
            return (
                <tr key={elem.id}>
                    <td><span>{elem.cat}</span></td>
                </tr>
            )
        })
    }

    return (
        <>
            <div>
                <div>
                    <div>
                        <div>
                            <NoSsr>
                                <Select
                                    classes={classes}
                                    styles={selectStyles}
                                    inputId="category"
                                    TextFieldProps={{
                                        label: 'Category',
                                        InputLabelProps: {
                                        htmlFor: 'category',
                                        shrink: true,
                                        },
                                        placeholder: 'Search',
                                    }}
                                    options={categories}
                                    components={components}
                                    value={category}
                                    onChange={handleChangeCategory}
                                />
                            </NoSsr>
                            <span>Select</span>
                        </div>
                        <div>
                            <label>&nbsp;</label>
                            <span onClick={addItems}></span>
                        </div>
                    </div>
                    <div>
                        <div>
                            <div>
                                <table>
                                    <thead>
                                        <tr>
                                            <th>
                                                <span>Category</span>
                                            </th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        {body()}
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </>
    )
}

export default App;

这个想法是选择一个类别并添加项目。

我需要的是能够在单击 &lt;span onClick={addItems}&gt;&lt;/span&gt; 后能够更新地图 (return item &amp;&amp; item.map((elem,j) =&gt; {...})),它调用了添加项目的 addItems 函数。简单地说,我需要将其添加到表格中而无需更新。

我该怎么做,建议?

【问题讨论】:

    标签: javascript json reactjs api async-await


    【解决方案1】:

    您需要将依赖项添加到useEffect,以便每次用户想要添加项目时,都会调用getItems() 请求以获取新项目。因此,您的代码可能如下所示:

    const App = () => {
        const [item, setItem] = useState([])
        const [category, setCategory] = useState([])
        const [addedItem, setAddedItem] = useState('')
        
        
        const categories = category.map(elem => ({
            value: elem.id,
            label: elem.cat,
        }));
    
        const [categorySelect, setCategorySelect] = React.useState(null);
    
        function handleChangeCategory(value) {
            setCategorySelect(value);
        }
    
        useEffect(() => {
            getItems()
        }, [addedItem])
    
        useEffect(() => {
            getCategories()
        }, [])
    
        const getItems = async () => {
            const response = await axios.get(REQUEST_1)
            setItem(response.data)
        }
    
        const getCategories = async () => {
            const response = await axios.get(REQUEST_2)
            setCategory(response.data)
        }
    
        const addItems = () => {
            const response = await axios.post(`${REQUEST_1}`, {cat: category_select.value});
            setAddedItem(response.data)
        };
    
        const body = () => {
            return item && item.map((elem,j) => {
                return (
                    <tr key={elem.id}>
                        <td><span>{elem.cat}</span></td>
                    </tr>
                )
            })
        }
    
        return (
            <>
                <div>
                    <div>
                        <div>
                            <div>
                                <NoSsr>
                                    <Select
                                        classes={classes}
                                        styles={selectStyles}
                                        inputId="category"
                                        TextFieldProps={{
                                            label: 'Category',
                                            InputLabelProps: {
                                            htmlFor: 'category',
                                            shrink: true,
                                            },
                                            placeholder: 'Search',
                                        }}
                                        options={categories}
                                        components={components}
                                        value={category}
                                        onChange={handleChangeCategory}
                                    />
                                </NoSsr>
                                <span>Select</span>
                            </div>
                            <div>
                                <label>&nbsp;</label>
                                <span onClick={addItems}></span>
                            </div>
                        </div>
                        <div>
                            <div>
                                <div>
                                    <table>
                                        <thead>
                                            <tr>
                                                <th>
                                                    <span>Category</span>
                                                </th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                            {body()}
                                        </tbody>
                                    </table>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </>
        )
    }
    
    export default App;
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多