Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Immer未更新组件的重新使用_Reactjs_Redux_React Redux_Immer.js - Fatal编程技术网

Reactjs Immer未更新组件的重新使用

Reactjs Immer未更新组件的重新使用,reactjs,redux,react-redux,immer.js,Reactjs,Redux,React Redux,Immer.js,我正在尝试将元素添加到Redux存储区中对象的数组中。我看到对象被添加到存储中,但它没有更新组件。如果我离开页面并返回,它就会显示出来 我很确定这是一个状态突变的问题,但我不知道我错在哪里,除非我从根本上误解了伊默在做什么。在组件中,我使用product将字符串添加到数组中,将新对象传递给我的reducer,并使用product将该对象添加到这些对象的数组中 我已经研究了大量类似的问题,这些问题都与状态突变有关,但我理解的方式是,组件调用product的返回应该是一个全新的对象。然后在reduc

我正在尝试将元素添加到Redux存储区中对象的数组中。我看到对象被添加到存储中,但它没有更新组件。如果我离开页面并返回,它就会显示出来

我很确定这是一个状态突变的问题,但我不知道我错在哪里,除非我从根本上误解了伊默在做什么。在组件中,我使用product将字符串添加到数组中,将新对象传递给我的reducer,并使用product将该对象添加到这些对象的数组中

我已经研究了大量类似的问题,这些问题都与状态突变有关,但我理解的方式是,组件调用product的返回应该是一个全新的对象。然后在reducer中,对product的调用应该返回一个新的对象数组

这是第一次在大型项目中使用Immer,所以我完全有可能不完全了解它的工作原理,这很神奇

组成部分


非常感谢您的帮助!!如果需要,更多信息可用

尝试添加
返回在案例块的末尾


您可以阅读更多关于生产者返回数据的内容,并查看应做什么和不应做什么的示例。

您缺少
break在您的
案例
语句中。“那是故意的吗?”TheBosZ不,那只是一个幸运的命令。后来当我添加了更多类型时,我最终添加了它们,但仍然没有弄明白为什么我没有得到更新。直接的平等性检查确实表明旧州和新州是不同的。现在我也面临同样的问题,请问您是如何解决您的问题的。请解释清楚一点,你能用一个关于你的答案的解释来扩展你的答案吗?为什么它会起作用??
import produce              from 'immer';
import React, { Component } from 'react';
import { connect }          from 'react-redux';
import { Link }             from 'react-router-dom';
import uuid                 from 'uuid/v4';
import { generate }         from 'generate-password';

import { updateLeague } from '../../actions/leagues';
import { addTeam }      from '../../actions/teams';
import { addUser }      from '../../actions/users';
import Team             from '../../classes/Team';
import User             from '../../classes/User';
import UserWidget       from '../utils/user/UserWidget';

class ViewLeague extends Component {
  state = {
    league     : null,
    isOwner    : false,
    owner      : '',
    teams      : [],
    inviteEmail: ''
  };

  componentWillMount() {
    console.log('mount props', this.props.leagues);
    const { leagues, uuid, leagueId, users, teams } = this.props;
    if (leagues.length > 0) {
      const league      = leagues.find(league => league.uuid === leagueId);
      const owner       = users.find(user => league.leagueManager === user.uuid);
      const leagueTeams = teams.filter(team => league.teams.includes(team.uuid));
      this.setState({
        league,
        isOwner: league.leagueManager === uuid,
        owner,
        teams  : leagueTeams
      });
    }
  }

  handleUpdate(event, fieldName) {
    this.setState({ [ fieldName ]: event.target.value });
  }

  findUserByEmail(email) {
    //Todo if not found here hit server
    return this.props.users.find(user => user.email === email);
  }

  sendInvite = () => {
    const { addTeam, addUser, updateLeague } = this.props;
    const { league }                         = this.state;
    const newManager                         = this.findUserByEmail(this.state.inviteEmail);
    const newTeamUuid                        = uuid();
    let newLeague                            = {};
    if (newManager) {
      const newTeam = new Team('New Team', newManager.uuid, newTeamUuid);
      addTeam(newTeam);
    } else {
      const newPass     = generate({
        length   : 10,
        number   : true,
        uppercase: true,
        strict   : true
      });
      const newUserUuid = uuid();
      const newUser     = new User('', this.state.inviteEmail, newPass, '', '', newUserUuid);
      addUser(newUser);
      const newTeam = new Team('New Team', newUserUuid, newTeamUuid);
      addTeam(newTeam);
      newLeague = produce(league, draft => {draft.teams.push(newTeamUuid);});
      updateLeague(newLeague);
      console.log('invite props', this.props);
      console.log('league same', league === newLeague);
    }

    //Todo handle sending email invite send password and link to new team
    console.log('Invite a friend', this.state.inviteEmail);
  };

  renderInvite() {
    const { isOwner, league, teams } = this.state;
    if (isOwner) {
      if ((league.leagueType === 'draft' && teams.length < 8) || league.leagueType !== 'draft') {
        return (
            <div>
              <p>You have an empty team slot. Invite a fried to join!</p>
              <input type="text"
                     placeholder={'email'}
                     onChange={() => this.handleUpdate(event, 'inviteEmail')}/>
              <button onClick={this.sendInvite}>Invite</button>
            </div>
        );
      }
    }
  }


  renderViewLeague() {
    console.log('render props', this.props.leagues);
    const { league, owner, teams } = this.state;
    const editLink                 = this.state.isOwner ?
        <Link to={`/leagues/edit/${this.props.leagueId}`}>Edit</Link> :
        '';
    return (
        <div>
          <h2>{league.leagueName} </h2>
          <h3>League Manager: <UserWidget user={owner}/> - {editLink}</h3>
          <p>League Type: {league.leagueType}</p>
          {this.renderInvite()}
          <br/>
          <hr/>
          <h2>Teams</h2>
          <span>{teams.map((team) => (<p key={team.uuid}>{team.teamName}</p>))}</span>
          <span>
            <h2>Scoring:  </h2>
            {league.scoring.map((score, index) => (
                    <p key={index}>{`Round ${index + 1}: ${score} points`}</p>
                )
            )}
          </span>
        </div>
    );
  }


  render() {
    if (!this.state.league) {
      return (
          <div>
            <h2>No league Found</h2>
          </div>
      );
    } else {
      return (
          <div>
            {this.renderViewLeague()}
          </div>
      );
    }

  }
}

export default connect(
    ({ leagues: { leagues }, teams: { teams }, users: { users }, auth: { uuid } },
     { match: { params: { leagueId } } }) => ({
      leagues,
      teams,
      users,
      uuid,
      leagueId
    }), ({
      addTeam     : (team) => addTeam(team),
      addUser     : (user) => addUser(user),
      updateLeague: (league) => updateLeague(league)
    })
)(ViewLeague);
import produce from 'immer';

import {
  ADD_LEAGUE,
  UPDATE_LEAGUE
} from '../actions/types';

const DEFAULT_LEAGUES = {
  leagues: [ {
    leagueName   : 'Test League',
    leagueManager: 'testUser12345',
    uuid         : 'testLeague12345',
    teams        : [ 'testTeam12345', 'testTeam23456' ],
    scoring      : [ 25, 20, 15, 10, 5, -5 ],
    leagueType   : 'draft'
  } ]
};

const leaguesReducer = (state = DEFAULT_LEAGUES, action) =>
    produce(state, draft => {
      // noinspection FallThroughInSwitchStatementJS
      switch (action.type) {
        case ADD_LEAGUE:
          draft.leagues.push(action.league);
        case UPDATE_LEAGUE:
          console.log('updating league', action.league);
          const { league }  = action;
          const leagueIndex = draft.leagues.findIndex(fLeague => league.uuid === fLeague.uuid);
          draft.leagues.splice(leagueIndex, 1, league);
      }
    });

export default leaguesReducer;