"dispatch is not a function at onSubmit" 点击提交按钮后
"dispatch is not a function at onSubmit" after clicking submit button
在输入字段中输入文本并单击提交按钮后出现错误:Uncaught TypeError: dispatch is not a function
在提交
连接状态和道具似乎是正确的。
有什么问题吗?
*/TODOLIPUT*/
import React from 'react'
import { connect } from 'react-redux'
import {addTodo} from '../actions/index'
import {bindActionCreators} from 'redux'
let AddTodo = ({ dispatch }) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
dispatch(addTodo(input.value))
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
const mapStateToProps = (state) => {
return {
todos: state.todos
}
}
function matchDispatchToProps(dispatch){
return bindActionCreators({addTodo: addTodo}, dispatch);
}
export default connect(mapStateToProps, matchDispatchToProps)(AddTodo)
/*TODOLIST*/
import React from 'react';
import {Todo} from './todo';
import { connect } from 'react-redux'
import {bindActionCreators} from 'redux'
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map(todo =>
<Todo {...todo} />
)}
</ul>
)
function mapStateToProps(state) {
return {
todos:state.todos
}
}
export default connect(mapStateToProps, null)(TodoList)
/* REDUCER */
import {combineReducers} from 'redux';
export const reducers = combineReducers({
todos:todos
})
export function todos(state=[], action) {
switch(action.type) {
case 'ADD_TODO':
return [
...state,
{
text:text,
completed:false
}
]
default:
return state
}
}
*/ACTION*/
export const addTodo = (text) => {
return {
type: 'ADD_TODO',
text
}
}
您不需要使用 dispatch
,因为您已经在 mapDispatchToProps
中使用了 bindActionCreators
。
bindActionCreators
是一个使动作创建者能够直接调度动作的助手。因此,您只需调用您的动作创建器,它就会自动分派动作。
你可以使用dispatch
而不通过mapDispatchToProps
,或者你可以使用mapDispatchToProps
注入的道具而不使用dispatch
。这就是 mapDispatchToProps
被这样调用的原因——它让你可以根据 dispatch 定义一些其他的 props,这样你就不需要再次使用它了。
检查这个:https://github.com/reactjs/react-redux/blob/master/docs/api.md#examples
您可以进行两项更改以使您的代码正常工作。
首先:如果您在组件中使用dispatch
,则无需使用mapDispatchToProps
,因为默认情况下connect
export default connect(mapStateToProps)(AddTodo)
第二:另一种方法是使用 bindActionCreators 绑定你的 action creators 以进行调度,因此你的组件中不需要单独的调度事件
let AddTodo = (props) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
props.addTodo(input.value);
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
还有一件事,因为您在 AddTodo
参数中将道具解析为 {dispatch}
,您将无法访问 todos
状态。
在输入字段中输入文本并单击提交按钮后出现错误:Uncaught TypeError: dispatch is not a function 在提交
连接状态和道具似乎是正确的。
有什么问题吗?
*/TODOLIPUT*/
import React from 'react'
import { connect } from 'react-redux'
import {addTodo} from '../actions/index'
import {bindActionCreators} from 'redux'
let AddTodo = ({ dispatch }) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
dispatch(addTodo(input.value))
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
const mapStateToProps = (state) => {
return {
todos: state.todos
}
}
function matchDispatchToProps(dispatch){
return bindActionCreators({addTodo: addTodo}, dispatch);
}
export default connect(mapStateToProps, matchDispatchToProps)(AddTodo)
/*TODOLIST*/
import React from 'react';
import {Todo} from './todo';
import { connect } from 'react-redux'
import {bindActionCreators} from 'redux'
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map(todo =>
<Todo {...todo} />
)}
</ul>
)
function mapStateToProps(state) {
return {
todos:state.todos
}
}
export default connect(mapStateToProps, null)(TodoList)
/* REDUCER */
import {combineReducers} from 'redux';
export const reducers = combineReducers({
todos:todos
})
export function todos(state=[], action) {
switch(action.type) {
case 'ADD_TODO':
return [
...state,
{
text:text,
completed:false
}
]
default:
return state
}
}
*/ACTION*/
export const addTodo = (text) => {
return {
type: 'ADD_TODO',
text
}
}
您不需要使用 dispatch
,因为您已经在 mapDispatchToProps
中使用了 bindActionCreators
。
bindActionCreators
是一个使动作创建者能够直接调度动作的助手。因此,您只需调用您的动作创建器,它就会自动分派动作。
你可以使用dispatch
而不通过mapDispatchToProps
,或者你可以使用mapDispatchToProps
注入的道具而不使用dispatch
。这就是 mapDispatchToProps
被这样调用的原因——它让你可以根据 dispatch 定义一些其他的 props,这样你就不需要再次使用它了。
检查这个:https://github.com/reactjs/react-redux/blob/master/docs/api.md#examples
您可以进行两项更改以使您的代码正常工作。
首先:如果您在组件中使用dispatch
,则无需使用mapDispatchToProps
,因为默认情况下connect
export default connect(mapStateToProps)(AddTodo)
第二:另一种方法是使用 bindActionCreators 绑定你的 action creators 以进行调度,因此你的组件中不需要单独的调度事件
let AddTodo = (props) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
props.addTodo(input.value);
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
还有一件事,因为您在 AddTodo
参数中将道具解析为 {dispatch}
,您将无法访问 todos
状态。