繁体   English   中英

如何在 useEffect 中进行两次 fetch 调用? ['解决']

[英]How do I make two fetch calls in useEffect? ['Resolved']

我正在开始项目的开发并面临以下问题“错误:重新渲染过多。React 限制了渲染次数以防止无限循环。” 我正在尝试在 useEffect 中使用几个获取请求。 即我希望这两个请求在组件启动时只执行一次。 如何才能做到这一点? 在此处输入图像描述

  const UserProfile = () => {

  const [newParams, setNewParams] = useState({
    surname: '',
    name: '',
    middlename: '',
    organization: '',
    email: '',
    phone: '',
    department: '',
    position: '',
    login: '',
    ScheduleId: ''
  })

  const [users, setUsers] = useState([])

  const [workSchedule, setWorkSchedule] = useState(
    []
  )

  const [workStatus, setWorkStatus] = useState(false)

  useEffect(() => {

    const fetch1 = fetch('/profile')
      .then(res => res.json())
      .then(users => {console.log(users); setUsers(users)});

    const fetch2 = fetch('/workSchedule' + '/' + '1')
      .then(res => res.json())
      .then(workSchedule => setWorkSchedule(workSchedule));
      
  }, [])

  function updateInput(event) {
    let temp = Object.assign({}, newParams);
    switch(event.target.className) {
      case 'CurrentDepartment':
        temp = Object.assign({}, newParams);
        temp = users[0]
        temp.department = event.target.value;
        setNewParams(temp)
      case 'CurrentPosition':
        temp = Object.assign({}, newParams);
        temp = this.state.users[0]
        temp.position = event.target.value;
        setNewParams(temp)
      default:
        console.log("Failed");
    }
  }

  function uploadNewDate() {

    let temp = users[0]

    fetch('/update-user', {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json',
        'Content-Length': '<calculated when request is sent>'
      },
      body: JSON.stringify(temp)
    }).then(function(response) {
      console.log(response)
      return response.json()
    });
  }

  function updateUserStatus() {
    var date = new Date();
    let workStatus = date.getDay();
    if (workStatus > 5 && workStatus < 8) {
      workStatus = true
    } else {
      workStatus = false
    }
    
    setWorkStatus(workStatus)
  }
      
      return (
        <div className="Frame">
          {users.map((user, index) => {
            return (
              <div className="Profile" key={"profile" + index}>
                <div className="UserProfile">
                  <a className="ApproveButton" onClick={uploadNewDate}></a>
                  <div className="UserIcon">
                    <div className="Icon"></div>
                  </div>
                  <div className="UserInfo">
                    <div className="UserFIO">
                      <div id="Surname" className="Surname">{user.surname}</div>
                      <div className="Name">{user.name}</div>
                      <div className="MiddleName">{user.middlename}</div>
                    </div>
                    <p className="UserOrganization"></p>
                  </div>
                  <div className="UserStatus">
                    {workStatus?(
                      <>
                        <span className="OutputStatus"></span>
                        <h2 className="Status Status-output">Выходной</h2>
                      </> 
                    ):(
                      <>
                        <span className="WorkStatus"></span>
                        <h2 className="Status Status-working">Рабочий</h2>
                      </>
                    )}
                  </div>
                  <div className="UserContacts">
                    <div className="Contacts">
                      <a href="mailto:ivan32@mail.ru">{user.email}</a>
                      <a href="tel:89124566734">{user.phone}</a>
                    </div>
                  </div>
                </div>
                <div className="OrganizationInfo">
                  <div className="UserDepartment">
                    <div className="Department">Отдел</div>
                    <input id="Department" className="CurrentDepartment" defaultValue={user.department} onChange={updateInput}></input>
                  </div>
                  <div className="UserPosition">
                    <div className="Position">Должность</div>
                    <input id="Position" className="CurrentPosition" defaultValue={user.position} onChange={updateInput}></input>
                  </div>
                </div>
                <div className="WorkSchedule">
                  <div className="Schedule">
                    <Link to="/work-schedule">График работы</Link>
                    <div className="WorkTime">
                      <div className="LeftColumn">
                        <div>Понедельник</div>
                        <div>Вторник</div>
                        <div>Среда</div>
                        <div>Четверг</div>
                        <div>Пятница</div>
                        <div className="output_day">Суббота</div>
                        <div className="output_day">Воскресенье</div>
                      </div>
                      {workSchedule.map(workSchedule => {
                        updateUserStatus()
                        return (
                          <div className="RightColumn">
                            <div>{workSchedule.monday}</div>
                            <div>{workSchedule.tuesday}</div>
                            <div>{workSchedule.wednesday}</div>
                            <div>{workSchedule.thursday}</div>
                            <div>{workSchedule.friday}</div>
                            <div className="output">{workSchedule.saturday}</div>
                            <div className="output">{workSchedule.sunday}</div>
                          </div>
                        )
                      })}
                    </div>
                  </div>
                </div>
                <div className="UserLogin">
                  <div className="Login">
                    <p>Логин</p>
                    <p>{user.login}</p>
                  </div>
                </div>
              </div>
            );
          })}
        </div>
      );
}

export default UserProfile;

您的问题与useEffect没有任何关系。 您在每次渲染时都调用updateUserStatus()

                      {workSchedule.map(workSchedule => {
                        updateUserStatus()
                        return (

这将通过调用 setWorkStatus 更新组件的setWorkStatus ,这将触发重新渲染并重新开始该过程。 您的意思是使用updateUserStatus作为事件处理程序吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM