javascript – React&Redux:connect()到多个组件和最佳实践

前端之家收集整理的这篇文章主要介绍了javascript – React&Redux:connect()到多个组件和最佳实践前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开展我的第一个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;@H_502_8@ 
 

还有一个名为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);@H_502_8@ 
 

正如你所看到的,我使用redux提供的connect方法来创建我的容器.

我的问题如下:

如果我想要我的登录容器使用多个视图(例如:LoginForm和errorList显示错误),我需要手动(不连接,因为connect只有一个参数).就像是 :

class Login extends Component {

   render() {
      return (
         <div>
            <errorList />
            <LoginForm onSubmitLogin={ (id,pass)) } />
         </div>
      )
   }

}@H_502_8@ 
 

这是不好的做法吗?最好创建另一个使用errorList和LoginForm的演示组件(LoginPage),并创建一个连接到LoginPage的容器(登录)?

编辑:如果我创建第三个演示组件(LoginPage),我必须传递两次数据.像这样:集装箱 – > LoginPage – > LoginForm& ErrorList.
即使有上下文,似乎也没有办法走.

解决方法

我认为你在第二个例子中所拥有的非常接近.您只能创建一个连接的容器组件,并呈现多个表示组件.

在第一个例子中,实际上没有一个单独的容器组件:

import { connect } from 'react-redux'
import { login } from '../actions/creators/userActionCreators'
import LoginForm from '../components/LoginForm'

const mapDispatchToProps = (dispatch) => {
   return {
      onSubmitLogin: (id,pass))
   }
};

// `LoginForm` is being passed,so it would be the "container"
// component in this scenario
export default connect(null,mapDispatchToProps)(LoginForm);@H_502_8@ 
 

即使它在一个单独的模块中,您在这里做的是直接连接您的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))
   }
};

const mapStateToProps = (state) => {
   return {
       errors: state.errors
   };
};

export default connect(mapStateToProps,mapDispatchToProps)(Login);@H_502_8@ 
 

注意,Login组件现在被传递给connect,使其成为“容器”组件,然后errorList和LoginForm都可以被表示.他们的所有数据可以通过登录容器的道具传递.

猜你在找的JavaScript相关文章