javascript - 无法删除该值并取消选中复选框的项目?

标签 javascript arrays reactjs

也许这个问题有点令人困惑,因为我很困惑。问题我已经在数据库中列出了类别,我提取了它并创建了一个帖子。现在我正在尝试编辑帖子。类别采用复选框格式,如果选中它会添加 setCategories 状态,如果取消选中它将从状态中删除。我已获取该帖子并保存了该特定帖子的类别。我已经给他们看了检查。现在我正在尝试更改我添加的类别。我成功添加了更多内容,但无法删除它,也无法取消选中该复选框。请检查此代码...

我用破折号突出显示了 onChange 部分

这是代码

    import React, { useEffect, useState } from 'react';
    import { Alert, Button, Card, Container, Form } from 'react-bootstrap';
    import ReactMarkdown from 'react-markdown';
    import { useDispatch, useSelector } from 'react-redux';
    import { toast, ToastContainer } from 'react-toastify';
    import { listCategory } from '../actions/categoryActions';
    import { listPostDetails, updatePost } from '../actions/postActions';
    
    const EditPost = ({ history, match }) => {
      const postId = match.params.id;
    
      const [categories, setCategories] = useState([]);
    
      const dispatch = useDispatch();
    
      const userLogin = useSelector((state) => state.userLogin);
      const { userInfo } = userLogin;
    
      const categoryList = useSelector((state) => state.categoryList);
      const { categories: cateList } = categoryList;
    
      useEffect(() => {
        if (!userInfo) {
          history.push('/login');
        }
    
        if (!post || post._id !== postId) {
          dispatch(listPostDetails(postId));
        } else {
          setCategories(post.categories);
          console.log(categories);
        }
        dispatch(listCategory());
      }, [dispatch, history, userInfo, post, postId, categories]);
    
      const resetHandler = () => {
        setTitle('');
        setImg('');
        setCategories('');
        setDesc('');
      };
    
      const submitHandler = (e) => {
        e.preventDefault();
        dispatch(updatePost(postId, title, desc, img, categories));
        resetHandler();
        history.push('/my_posts');
      };
    
      return (
        <div className=" createPost mt-4 py-4">
          <ToastContainer />
          <Container>
            <h2>EDIT POST</h2>
            <Form onSubmit={submitHandler}>
              <Form.Group controlId="category" className="mb-2">
                <Form.Label>Select Categories</Form.Label>
                <br />
                {cateList?.map((cate) => (
                  <Form.Check
                    inline
                    key={cate._id}
                    type="checkbox"
                    label={cate.name}
                    checked={categories.includes(cate.name)}
------------------------------------------------------------------------------------------
                    onChange={(e) => {
                      if (e.target.checked) {
                        setCategories([categories.push(cate.name)]);
                      } else {
                        setCategories(
                          categories?.filter((cat) => cat !== cate.name)
                        );
                      }
                    }}
-------------------------------------------------------------------------------------------
                  />
                ))}
              </Form.Group>
              <Button
                type="submit"
                variant="success"
                style={{ letterSpacing: '2px', fontWeight: 'bold' }}>
                UPDATE
              </Button>
            </Form>
          </Container>
        </div>
      );
    };
    
    export default EditPost;

最佳答案

我认为问题出在 useEffect 方法上,您是 console.log(categories) 它不断刷新状态并且不允许您添加或删除项目。首先从 useEffect 中删除 console.log(categories)categories 依赖项,并使用此 setCategories([...categories, cate.name]); 而不是这个 setCategories([categories.push(cate.name)]);。您不应直接更改类别

关于javascript - 无法删除该值并取消选中复选框的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70106949/

相关文章:

reactjs - 为什么授权 header token 未显示在我的浏览器中

javascript - 在 deferred.resolve 中传递 WebElement 对象

arrays - 访问数组内的数组 (ng-repeat)

javascript - Backbone.js:执行 Fetch() 后,仅渲染新模型

javascript - 对象到数组的转换

java - 在此选择排序代码中,我从 {8,3,5,9,2} 得到一个数组答案 {2,3,3,5}

javascript - React Leaflet 弹出窗口在移动设备上不起作用

javascript - 应用 CSS 后未触发鼠标事件

javascript - Dropzone.js "Undefined index: file"如何与 Laravel 一起使用?

javascript - 无法使用 Protractor 中的 html 屏幕截图生成报告