Arm*_*ias 17 javascript reactjs redux
我正在研究我的第一个React/Redux项目,我有一个小问题.我读过的文档和观看提供的教程https://egghead.io/lessons/javascript-redux-generating-containers-with-connect-from-react-redux-visibletodolist.
但我还有一个问题.这是一个登录页面.所以我有一个名为LoginForm的表示组件:
组件/ LoginForm.js
import { Component, PropTypes } from 'react'
class LoginForm extends Component {
render () {
return (
<div>
<form action="#" onSubmitLogin={(e) => this.handleSubmit(e)}>
<input type="text" ref={node => { this.login = node }} />
<input type="password" ref={node => { this.password = node }} />
<input type="submit" value="Login" />
</form>
</div>
)
}
handleSubmit(e) {
e.preventDefault();
this.props.onSubmitLogin(this.login.value, this.password.value);
}
}
LoginForm.propTypes = {
onSubmitLogin: PropTypes.func.isRequired
};
export default LoginForm;
Run Code Online (Sandbox Code Playgroud)
还有一个名为Login的容器组件,它将数据传递给我的组件.使用react-redux-router,我称之为容器(而不是presentationnal组件):
集装箱/ Login.js
import { connect } from 'react-redux'
import { login } from '../actions/creators/userActionCreators'
import LoginForm from '../components/LoginForm'
const mapDispatchToProps = (dispatch) => {
return {
onSubmitLogin: (id, pass) => dispatch(login(id, pass))
}
};
export default connect(null, mapDispatchToProps)(LoginForm);
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用connectredux提供的方法来创建我的容器.
我的问题是以下一个:
如果我希望我的Login容器使用多个视图(例如:LoginForm和errorList来显示错误),我需要手动完成(没有连接,因为connect只接受一个参数).就像是 :
class Login extends Component {
render() {
return (
<div>
<errorList />
<LoginForm onSubmitLogin={ (id, pass) => dispatch(login(id, pass)) } />
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种不好的做法吗?是否更好地创建另一个使用errorList和LoginForm的表示组件(LoginPage)并创建一个容器(Login)connect到LoginPage?
编辑:如果我创建第三个表示组件(LoginPage),我将不得不传递两次数据.像这样:Container -> LoginPage -> LoginForm & ErrorList.即使有上下文,它似乎也不是要走的路.
Nic*_*all 28
我认为你在第二个例子中的内容非常接近.您只能创建一个已连接的容器组件并呈现多个表示组件.
在您的第一个示例中,实际上没有单独的容器组件:
import { connect } from 'react-redux'
import { login } from '../actions/creators/userActionCreators'
import LoginForm from '../components/LoginForm'
const mapDispatchToProps = (dispatch) => {
return {
onSubmitLogin: (id, pass) => dispatch(login(id, pass))
}
};
// `LoginForm` is being passed, so it would be the "container"
// component in this scenario
export default connect(null, mapDispatchToProps)(LoginForm);
Run Code Online (Sandbox Code Playgroud)
即使它是在一个单独的模块中,你在这里做的是LoginForm直接连接你.
相反,你可以做的是这样的:
集装箱/ Login.js
import { connect } from 'react-redux'
import { login } from '../actions/creators/userActionCreators'
import LoginForm from '../components/LoginForm'
import ErrorList from '../components/ErrorList'
class Login extends Component {
render() {
const { onSubmitLogin, errors } = this.props;
return (
<div>
<ErrorList errors={errors} />
<LoginForm onSubmitLogin={onSubmitLogin} />
</div>
)
}
}
const mapDispatchToProps = (dispatch) => {
return {
onSubmitLogin: (id, pass) => dispatch(login(id, pass))
}
};
const mapStateToProps = (state) => {
return {
errors: state.errors
};
};
export default connect(mapStateToProps, mapDispatchToProps)(Login);
Run Code Online (Sandbox Code Playgroud)
需要注意的是Login组件已被传递给connect,使之成为"容器"组件,然后同时errorList并LoginForm可以表象.他们的所有数据都可以通过Login容器传递道具.
| 归档时间: |
|
| 查看次数: |
23450 次 |
| 最近记录: |