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。
感谢大家的意见和建议! :)
我目前正在自学 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
感谢任何人的帮助。似乎大多数社区都赞成使用状态。
我还问了 Dan Abramov,他说在这种情况下他更喜欢裁判。 你可以看到他的回答here。
感谢大家的意见和建议! :)