【发布时间】:2016-10-02 12:11:36
【问题描述】:
大家好,我是 redux 的新手。我正在创建一个示例应用程序,如下所示:
入口点:index.js
import 'babel-polyfill'
import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import inboundApp from './reducers'
import App from './components/App'
let store = createStore(inboundApp)
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('app')
)
/components/App.js
import React from 'react'
import HeaderContainer from '../containers/HeaderContainer'
import LoginForm from '../containers/LoginForm'
const App = () => (
<div>
<HeaderContainer />
<LoginForm />
</div>
)
export default App
/containers/LoginForm.js
import React from 'react'
import { connect } from 'react-redux'
import { login } from '../actions'
let LoginForm = ({ dispatch }) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
dispatch(login(input.value))
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Login
</button>
</form>
</div>
)
}
LoginForm = connect()(LoginForm)
export default LoginForm
/actions/index.js
export const login = (supplierId) => {
return {
type: 'LOGIN',
supplierId
}
}
/containers/HeaderContainer.js
import { connect } from 'react-redux'
import Header from '../components/Header'
const mapStateToProps = (state) => {
return {
supplierId: state.supplierId
}
}
const HeaderContainer = connect(
mapStateToProps,
null
)(Header)
export default HeaderContainer
/components/Header.js
import React, { PropTypes } from 'react'
const Header = ({ supplierId}) => {
return (
<div>
<span>Your Supplier ID: </span> {supplierId}
</div>
)
}
export default Header
/reducers/loginForm.js
const loginForm = (state = '', action) => {
switch (action.type) {
case 'LOGIN':
return Object.assign({}, state, {
supplierId: action.supplierId
})
default:
return state;
}
}
export default loginForm
/reducers/index.js
import { combineReducers } from 'redux'
import loginForm from './loginForm'
const inboundApp = combineReducers({
loginForm
})
export default inboundApp
问题是我的演示组件 Header 没有通过单击 LoginForm.js 中的按钮触发的操作 LOGIN 得到更新强>。
你能帮我找出我缺少的东西吗?这段代码有什么问题?
谢谢
【问题讨论】:
-
查看 Redux 开发工具。看起来您的状态树可能不是您期望的状态。也许
supplierId应该从state.loginForm.supplierId连接。 -
@DavinTryon 非常感谢您的回复,这正是问题所在。但是我真的不明白为什么reducer名字来了?
-
combineReducers({ loginForm });扩展为combineReducers({ loginForm: loginForm });。因此,这是在名为loginForm的 store 上创建一个键,来自该 reducer 的所有缩减状态都将位于其下方。 -
是的,重要的是要知道 tour reducer 的键必须与状态键匹配
-
@DavinTryon 非常感谢。
标签: javascript node.js reactjs redux react-redux