javascript - 如何不使用 Redux 传递 props?

标签 javascript reactjs redux react-redux

我刚刚了解到我们可以使用 redux 来降低 React 项目的复杂性。通过单一事实来源(存储),我们不需要将状态传递给不需要它们的组件。我很难理解这个说法。

假设我有三个组件,A、B 和 C。A 是一个状态称为 text 的容器。 B 是自定义按钮,C 仅显示文本。每当单击 B 时,都会更新 A 中的状态。然后 C 将显示更新后的文本。

  A
 / \
C   B

我尝试将 redux 应用于应用程序,发现我仍然需要传递 props。唯一的区别是我传递的是 this.props.text 而不是 this.state.text

我不明白 redux 如何能让这样的应用程序受益。

App.js

import React, { Component } from "react";
import { connect } from 'react-redux'; 

import MyButton from "./MyButton";
import { handleClick } from "./actions"; 
import Display from "./Display"

class App extends Component {
  render() {
    return (
      <div className="App">
        <MyButton onClick={()=>this.props.handleClick(this.props.text)} />
        <Display text={this.props.text} />
      </div>
    );
  }
}

const mapStateToProps = state => ({
    text: state.text.text
})

const mapDispatchToProps = dispatch => ({
  handleClick: (text) => dispatch(handleClick(text))
})

export default connect(mapStateToProps, mapDispatchToProps)(App)

此外,如果我们有另一个具有如下结构的应用程序。假设 B 不关心 A 的状态,但 C 需要它来显示文本。我们可以跳过 B 而让 C 使用 A 的状态吗?

A
|
B
|
C

最佳答案

I think I found the solution. I simply created a file stores.js and export the store. So I can import it and retrieve the state by invoking store.getState() whenever a child component needs the it.

你不应该这样做。

相反,您应该对结构中任何需要访问商店属性的每个组件使用 connect 函数。

但是,如果您只有三个组件,您可能不需要 Redux 或全局存储来存储您的应用状态。

Redux 提供了很多关于如何处理全局状态的意见,这些意见旨在保护您的数据流。

否则,如果您只需要避免 Prop 钻探(即通过多个级别传递 Prop ,如第二个示例中所示),您可以使用 native React 上下文 API 来执行此操作:reactjs.org/docs/context.html

编辑 举个例子应该会更清楚:

import React, { Component } from "react";
import { connect } from 'react-redux'; 

import MyButtonCmp from "./MyButton";
import DisplayCmp from "./Display"

import { handleClick } from "./actions"; 

// I am doing the connect calls here, but tehy should be done in each component file
const mapStateToProps = state => ({
    text: state.text.text
})
const Display = connect(mapStateToProps)(DisplayCmp)

const mapDispatchToProps = dispatch => ({
  onClick: (text) => dispatch(handleClick(text))
})
const MyButton =  connect(null, mapDispatchToProps)(MyButtonCmp)

class App extends Component {
  render() {
    return (
      <div className="App">
        {/* No need to pass props here anymore */}
        <MyButton />
        <Display />
      </div>
    );
  }
}

// No need to connect App anymore
// export default connect(mapStateToProps, mapDispatchToProps)(App)

export default App

关于javascript - 如何不使用 Redux 传递 props?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58355723/

相关文章:

javascript - Google map API V3 TrafficLayer 小组件

javascript - 在字符串javascript中按类搜索

node.js - 通过重定向将数据从 Express 发送到 React

javascript - 如何在 redux 中实现 'load more' 功能?

javascript - 如何在通过 NPM 分发时管理 React 组件(Redux、CSS)的自定义方面

javascript - Reducer 没有将对象添加到数组中,而是添加了 null

javascript - 在 JavaScript 文件名之后使用的 "?"是什么意思?

javascript - 在 $routeProvider 中组合 .when() 方法

javascript - react 表与从/到映射

javascript - 登录 React.js 后重定向