【问题标题】:react hooks redux reducer onChange event late on last input反应钩子redux reducer onChange事件迟到最后输入
【发布时间】:2021-01-08 20:55:35
【问题描述】:

我正面临当前的问题。每当我单击按钮+ 时,当我尝试将该值保存到localStorage 时,onChange 事件在最后一次输入时延迟

我不熟悉使用 reduxreact hooks

我该如何解决这个问题?

动作

const ADD_BIRD = 'ADD_BIRD';
const INCREMENT_BIRD = 'INCREMENT_BIRD';

export function addBird(bird) {
  return {
    type: ADD_BIRD,
    bird,
  }
}

export function incrementBird(bird) {
  return {
    type: INCREMENT_BIRD,
    bird
  }
}

let defaultBirds = [];


if (window.localStorage.getItem('bird') !== null) {
    defaultBirds.push(
        {
          name: 'robin',
          // get localStorage value as number
          views: parseInt(window.localStorage.getItem('bird')),
        }
    );
} else {
    defaultBirds.push(
        {
          name: 'robin',
          views: 1,
        }
    );
}

减速机

function birds(state=defaultBirds, action) {
  switch (action.type) {
    case ADD_BIRD:
      return [
        ...state,
        {
          name: action.bird,
          views: 1
        }
      ];
    case INCREMENT_BIRD:
      const bird = state.find(b => action.bird === b.name);
      const birds = state.filter(b => action.bird !== b.name);
      console.log("birds", typeof(bird.views));
      // save to localStorage
      window.localStorage.setItem('bird', bird.views);
      return [
        ...birds,
        {
          ...bird,
          views: bird.views + 1
        }
      ];
    default:
      return state;
  }
}

App.js

function App() {
  const [birdName, setBird] = useState('');
  const birds = useSelector(state => state.birds);
  const dispatch = useDispatch();

  const handleSubmit = event => {
    event.preventDefault();
    dispatch(...addBird(birdName), setBird())
    setBird('');
  };

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

  return (
    <div className="wrapper">
      <h1>Bird List</h1>
      <form onSubmit={handleSubmit}>
        <label>
          <p>
            Add Bird
          </p>
          <input
            type="text"
            onChange={e => setBird(e.target.value)}
            value={birdName}
          />
        </label>
        <div>
          <button type="submit">Add</button>
        </div>
      </form>
      <ul>
        {birds.map(bird => (
          <li key={bird.name}>
            <h3>{bird.name}</h3>
            <div>
              Views: {bird.views}
              <button 
                 onClick={() => dispatch(incrementBird(bird.name))}>
                 <span role="img" aria-label="add">
                   ➕                                # + SIGN IS HERE
                 </span></button>
            </div>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

期待一些帮助。

【问题讨论】:

    标签: javascript reactjs algorithm react-native data-structures


    【解决方案1】:

    您正在设置 window.localStorage.setItem('bird', bird.views),而您实际上想要更新的视图 (bird.views + 1)。

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多