RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1408988
Accepted
elarri
elarri
Asked:2022-07-12 15:02:06 +0000 UTC2022-07-12 15:02:06 +0000 UTC 2022-07-12 15:02:06 +0000 UTC

即使渲染元素也不会渲染

  • 772

我有一个带有 DropDown 容器的下拉列表。该容器具有组。当全局状态发生变化并且必要的数据来自服务器时,会呈现 DropDown 元素:

const groupsWithData = useSelector(store => { return store.persons.structurePersons })
      useEffect(() => {
          if (groupsWithData) {
              setGroupElem(groupsWithData.map((item) => {
                  return <Group 
                  key={item.group_id} 
                  groupName={item.group_name} 
                  idGroup={item.group_id} 
                  positionData={item.group_data} 
                  isOpen={item.group_isOpen}
                  handleToggleVisibleGroup={handleToggleVisibleGroup}
                  />
              }))
            }          
      },[groupsWithData])

在这种情况下,很多东西都传递给了 Group 元素。Group 也是具有嵌套元素的元素。除了来自 State 的数据之外,还向 Group 传递了一个函数,该函数handleToggleVisibleGroup应该通过单击 Group 来更改组是打开还是关闭的符号。发生在我身上的事情 - 我渲染了一个 DropDown 并且我假设所有组都被渲染了,所以我如何根据全局状态展开 DropDown 并查看所有嵌套的组......我运行该函数

handleToggleVisibleGroup по клику на Group. 
    const handleToggleVisibleGroup = (groupId) => {
        dispatch(toggleVisiblePosition(groupId))
    }

reducer 为我工作,State 中的数据按计划更改...但是没有重新渲染...我查看了数据和 devtool 并感到惊讶... Group 根本没有渲染...我不明白发生了什么

在此处输入图像描述

整个 DropDown 组件:

import React, { useState, useEffect } from "react";
import './DropDown.css'
import Group from "../Group/Group";
import Button from "../Button/Button";

import {useDispatch, useSelector} from 'react-redux';
import { toggleVisiblePosition } from '../../redux/actions';

const DropDown = () => {
    const dispatch = useDispatch();
    const [isVisibleDopDown, setIsVisibleDropDown] = useState(false)
    const [groupElem, setGroupElem] = useState(<Group/>)

    const groupsWithData = useSelector(store => { return store.persons.structurePersons })

    const handleToggleVisibleGroup = (groupId) => {
        dispatch(toggleVisiblePosition(groupId))
    }

      useEffect(() => {
          if (groupsWithData) {
              setGroupElem(groupsWithData.map((item) => {
                  return <Group 
                  key={item.group_id} 
                  groupName={item.group_name} 
                  idGroup={item.group_id} 
                  positionData={item.group_data} 
                  isOpen={item.group_isOpen}
                  handleToggleVisibleGroup={handleToggleVisibleGroup}
                  />
              }))
            }          
      },[groupsWithData])


    const toggleVisibleDropDown = (e) => {
        setIsVisibleDropDown(!isVisibleDopDown)
    }

    return (
        <div className="drop-down">
            <Button
                handleClick={toggleVisibleDropDown}
                cusStyle={`button button_drop-down-menu ${isVisibleDopDown === true ? 'button_drop-down-menu_visible' : ''}`}
                text={'Сотрудники'}
            />
            <ul className={`drop-down__container ${isVisibleDopDown === true ? 'drop-down__container_visible' : ''}`}>
                {groupElem}
            </ul>
        </div>
    )
}

export default DropDown;

组组件

import './Group.css'
import React from "react";
import Checkbox from "../Checkbox/Checkbox";
import Position from "../Position/Position";
import arrow from "../../img/arrow.png";
import uniq from 'uniqid';


const Group = ({ groupName, positionData, idGroup, isOpen, handleToggleVisibleGroup }) => {

    return (
        <li onClick={() => handleToggleVisibleGroup(idGroup)} className="group">
            <div className="group__header">
                <Checkbox label={groupName} />
                <img className="group__header-img" src={arrow} alt="" />
            </div>
            <ul className={`group__items-list ${isOpen === true ? 'group__items-list_visible' : ''}`}>
                {
                    positionData.map((item) => {
                        const keyId = uniq()
                        return <Position
                            id={keyId}
                            key={keyId}
                            label={item.position_name}
                            persons={item.persons}
                        />
                    })
                }
            </ul>
        </li>
    )
}

export default Group;

我还添加了状态的显示方式。可以看到,点击Group的时候,group_isOpen属性变成了true,但是这个只有在我关闭再重新打开DropDown后才会显示

在此处输入图像描述

减速机代码:

import personsUtils from '../utils/personsUtils';
import { GET_ALL_PERSONS, TOGGLE_VISIBLE_POSITION } from "./types"


const initialState = {
    mainStatePersons: [],
    structurePersons: []
}

export const persons = (state=initialState, action) => {
    switch(action.type) {
        case GET_ALL_PERSONS:
        const persons = personsUtils.setId(action.allPersons)
        const positions = personsUtils.getPositionsPerson(persons);
        return {
            ...state,
            mainStatePersons: persons,
            structurePersons: positions
        }
        
        case TOGGLE_VISIBLE_POSITION:
        state.structurePersons.some((item) => {
            if (item.group_id === action.id) {
                item.group_isOpen = !item.group_isOpen;
                return true
            }
            return false
        })
        return {
            ...state
        }
        default:
            return state
    }
}
reactjs
  • 1 1 个回答
  • 67 Views

1 个回答

  • Voted
  1. Best Answer
    xydope
    2022-07-12T17:42:40Z2022-07-12T17:42:40Z

    你已经有了一个数据源,你的 redux 存储,除此之外,useState增加它没有任何意义。请参阅下面的评论。

    ps 要生成类名列表,请使用类名库

    import React, { useState, useEffect } from "react";
    import "./DropDown.css";
    import Group from "../Group/Group";
    import Button from "../Button/Button";
    
    import { useDispatch, useSelector } from "react-redux";
    import { toggleVisiblePosition } from "../../redux/actions";
    
    const DropDown = () => {
      const dispatch = useDispatch();
      //получили данные
      const groupsWithData = useSelector((store) => {
        return store.persons.structurePersons;
      });
    
      const [isVisibleDopDown, setIsVisibleDropDown] = useState(false);
      //const [groupElem, setGroupElem] = useState(<Group />) зачем оно здесь?;
    
      const handleToggleVisibleGroup = (groupId) => {
        dispatch(toggleVisiblePosition(groupId));
      };
    
      /*
      не нужен
      useEffect(() => {
        if (groupsWithData) {
          setGroupElem(
            groupsWithData.map((item) => {
              return (
                <Group
                  key={item.group_id}
                  groupName={item.group_name}
                  idGroup={item.group_id}
                  positionData={item.group_data}
                  isOpen={item.group_isOpen}
                  handleToggleVisibleGroup={handleToggleVisibleGroup}
                />
              );
            })
          );
        }
      }, [groupsWithData]);*/
    
      const toggleVisibleDropDown = (e) => {
        setIsVisibleDropDown(!isVisibleDopDown);
      };
    
      return (
        <div className="drop-down">
          <Button
            handleClick={toggleVisibleDropDown}
            cusStyle={`button button_drop-down-menu ${
              isVisibleDopDown === true ? "button_drop-down-menu_visible" : ""
            }`} 
            text={"Сотрудники"}
          />
          <ul
            className={`drop-down__container ${
              isVisibleDopDown === true ? "drop-down__container_visible" : ""
            }`}
          >
            {
              //сразу строим компоненты
              groupsWithData.map((item) => {
                return (
                  <Group
                    key={item.group_id}
                    groupName={item.group_name}
                    idGroup={item.group_id}
                    positionData={item.group_data}
                    isOpen={item.group_isOpen}
                    handleToggleVisibleGroup={handleToggleVisibleGroup}
                  />
                );
              })
            }
          </ul>
        </div>
      );
    };
    
    export default DropDown;

    更新。Group 当我在 props 上建立类名的依赖关系时,我遇到了类似的问题。isOpen = false如果(请参见下面的示例)或使用类名(上面的链接),请尝试根本不渲染元素

    import "./Group.css";
    import React from "react";
    import Checkbox from "../Checkbox/Checkbox";
    import Position from "../Position/Position";
    import arrow from "../../img/arrow.png";
    import uniq from "uniqid";
    
    const Group = ({
      groupName,
      positionData,
      idGroup,
      isOpen,
      handleToggleVisibleGroup,
    }) => {
      return (
        <li onClick={() => handleToggleVisibleGroup(idGroup)} className="group">
          <div className="group__header">
            <Checkbox label={groupName} />
            <img className="group__header-img" src={arrow} alt="" />
          </div>
          {
          //если isOpen = false, то не рендерим
          isOpen && (
            <ul className={`group__items-list group__items-list_visible`}>
              {positionData.map((item) => {
                const keyId = uniq();
                return (
                  <Position
                    id={keyId}
                    key={keyId}
                    label={item.position_name}
                    persons={item.persons}
                  />
                );
              })}
            </ul>
          )}
        </li>
      );
    };
    
    export default Group;

    • 1

相关问题

  • 如果图像在道具中,如何使背景图像做出反应?

  • 项目未显示

  • 引发错误:InvalidTokenError: Invalid token specified: Cannot read property 'replace' of undefined

  • 如何在没有 node.js 的情况下运行 react.js 应用程序

  • 如何从 React Native 中的导航堆栈中清除上一个屏幕?

  • 为什么渲染后会触发 Click 事件?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5