当前位置: 首页 > 面试题库 >

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

秦才英
2023-03-14
问题内容

我正在做我的第一个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;

还有一个名为Login的容器组件,它将数据传递给我的组件。使用react-redux-
router,我将此容器(而不是presentationnal组件)称为:

container / 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);

如您所见,我正在使用connectredux提供的方法来创建我的容器。

我的问题是以下问题:

如果我希望我的Login容器使用多个视图(例如:LoginForm和errorList来显示错误),则需要手动执行(不使用connect,因为connect只接受一个参数)。就像是

class Login extends Component {

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

}

这是不好的做法吗?是否最好创建同时使用errorList和LoginForm的另一个表示性组件(LoginPage),并创建要登录connect到LoginPage
的容器(Login)?

编辑: 如果我创建第三个演示组件(LoginPage),我将不得不两次传递数据。这样:Container -> 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) => dispatch(login(id, pass))
   }
};

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

即使它在单独的模块中,您在这里所做的还是LoginForm直接连接您的模块。

相反,您可以执行以下操作:

container / 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);

请注意,该Login组件现在正在传递给connect,使其成为“容器”组件,然后errorListLoginForm都可以是表示形式。Login容器可以通过prop传递其所有数据。



 类似资料:
  • 我计划使用我的状态作为一种信号形式,我将来回改变以显示我的加载屏幕、主窗体和成功或错误消息。但不确定这是否是最佳实践。下面是一个示例代码 但我不确定这是否是最好的方法,我担心这会减慢我的应用程序或消耗客户机的CPU。你能推荐更好的方法吗?

  • 我正在寻找一个最佳实践,有一个ReactJS组件负责用户编辑给定实体的表单。非常简单的例子。在许多情况下,实际的表单会有更多的字段和更多的GUI功能。 表单的字段直接编辑实体对象,然后将其保存到RESTful API中。我希望组件被更新,因为用户改变字段,所以GUI可以根据输入在键入(如验证,信息等)。 null 在上面的简化示例中,我使用受控输入。这导致在每次更改时更新状态并重新呈现组件(就像文

  • 译者:cvley torch.multiprocessing 是 Python 的 multiprocessing 的直接替代模块。它支持完全相同的操作,但进行了扩展,这样所有的张量就可以通过一个 multiprocessing.Queue 进行传递,将数据移动到共享内存并只将句柄传递到另一个进程。 注意 当一个 Tensor 传递到另一个进程时,Tensor 的数据是共享的。如果 torch.T

  • torch.multiprocessing是Pythonmultiprocessing的替代品。它支持完全相同的操作,但扩展了它以便通过multiprocessing.Queue发送的所有张量将其数据移动到共享内存中,并且只会向其他进程发送一个句柄。 Note 当Variable发送到另一个进程时,Variable.data和Variable.grad.data都将被共享。 这允许实现各种训练方法

  • 我目前正在做一个使用Django API服务器和运行React的NodeJS服务器的项目。在开发中,我们在8000端口上运行Django,在8080端口上运行NodeJS,目前React负责渲染页面并与Django API交互,Django API为React提供数据。为了让React调用Django API,我们在Django中启用了CORS,因为它们位于不同的端口上。 我的问题如下: > 允许

  • 我的React组件需要一个ajax调用来获取要呈现的数据。 最初,我使用该方法在Render中启动了一个ajax调用。这是我的伪代码... 在阅读了关于呈现调用的React文档后,我有点担心在呈现调用中更改存储区,即使是异步的。 我提出了另一种使用componentDidMount和ComponentDidUpDate的方法。这最终变得稍微复杂一些,因为在最初呈现组件时,componentDidM

  • 问题内容: 我现在大约有7个Javascript文件(由于使用了各种jQuery插件)和4-5个CSS文件。我对处理这些问题的最佳做法感到好奇,包括应该在文档中的何处加载它们?YSlow告诉我,如果可能的话,应在末尾包含Javascript文件。身体的尽头?它提到的问题似乎在于他们是否编写内容。我所有的Javascript文件都是函数和jQuery代码(在ready()时全部完成),因此应该可以。

  • 我最近用react启动了另一个项目,因为我有一点时间来摆弄,我使用了带有挂钩的功能组件。我没有任何问题,只有一件事我不确定我是否正确使用,下面是一个例子: 如果我喜欢每件事的处理方式,我想使用loadData()是肮脏的;就像在前面的例子中,我尝试使用effect来处理如下内容: 但后来我得到了一个警告,比如“loadData应该是useEffect的依赖项”。如果我省略了useEffect的第二