React 和 Redux:使用 state 还是 refs?

React and Redux: Using state or refs?

我目前正在自学 Redux。为此,我创建了一个简单的 Todo 应用程序。现在,在这个应用程序上,我目前正在使用 dispatch() 将待办事项放入我的商店。这是一个关于你的看法的问题。我想避免代码异味。

我找到了两种实现此目的的方法。一种使用 state,另一种使用 ref。我想知道哪种方法更好?谢谢你的任何建议。两个版本如下。

第一版使用 ref:

import React, { Component } from "react";
import Todo from "./Todo";
import { connect } from "react-redux";
import { ADD_TODO } from "./actionCreators";

class TodoList extends Component {
  taskRef = React.createRef();
  handleSubmit = event => {
    event.preventDefault();
    this.props.dispatch({
      type: ADD_TODO,
      task: this.taskRef.current.value
    });
    event.currentTarget.reset();
  };
  render() {
    let todos = this.props.todos.map((val, index) => (
      <Todo task={val.task} key={index} />
    ));
    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <label htmlFor="task">Task </label>
          <input type="text" name="task" id="task" ref={this.taskRef} />
          <button type="submit">Add a Todo!</button>
        </form>
        <ul>{todos}</ul>
      </div>
    );
  }
}

const mapDispatchToProps = state => ({
  todos: state.todos
});

export default connect(mapDispatchToProps)(TodoList);

这是使用 state 的第二个版本:

import React, { Component } from "react";
import Todo from "./Todo";
import { connect } from "react-redux";
import { ADD_TODO } from "./actionCreators";

class TodoList extends Component {
  state = {
    task: ""
  };
  handleSubmit = event => {
    event.preventDefault();
    this.props.dispatch({
      type: ADD_TODO,
      task: this.state.task
    });
    event.target.reset();
  };
  handleChange = event => {
    event.persist();
    this.setState((state, props) => ({
      [event.target.name]: event.target.value
    }));
  };
  render() {
    let todos = this.props.todos.map((val, index) => (
      <Todo task={val.task} key={index} />
    ));
    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <label htmlFor="task">Task </label>
          <input
            type="text"
            name="task"
            id="task"
            onChange={this.handleChange}
          />
          <button type="submit">Add a Todo!</button>
        </form>
        <ul>{todos}</ul>
      </div>
    );
  }
}

const mapDispatchToProps = state => ({
  todos: state.todos
});

export default connect(mapDispatchToProps)(TodoList);

编辑: 因为 qasimalbaqali pointed out in the comments 与 Whosebug 上的 post 类似。我仍然不确定,因为第一个答案说 refs 不好是有原因的,第二个回答说 React Devs 说 refs 非常适合从 dom 中获取值(这就是我正在做的!)。

感谢任何人的帮助。似乎大多数社区都赞成使用状态。

我还问了 Dan Abramov,他说在这种情况下他更喜欢裁判。 你可以看到他的回答here

感谢大家的意见和建议! :)