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

Redux,如果我想访问数据,是否必须在所有容器中导入存储?

宣星光
2023-03-14
问题内容

也许我并没有全神贯注于redux,但是我所看到的所有示例并没有在容器之间真正访问过多的状态,因此我并没有看到store.getState()的大量使用,但是即使您想要派遣,您需要进入商店,对不对?

因此,除了从“路径/到/商店/商店”导入导入商店

在每个我想要getState()或“ dispatch”的文件中,我如何访问该状态,因为如果不包含它,则存储是未定义的。


问题答案:

通常,您只希望使那些可以访问商店的顶级容器组件成为可能-
它们会将所有必要的数据或操作分派作为其子组件的道具传递。这是“智能”和“哑”组件之间的区别-“智能”组件了解Redux的存储/状态,而“哑”组件只是将prop传递给它们,而对更大的应用程序状态一无所知。

但是,即使只是将商店传递到容器组件也可能变得乏味。这就是为什么React-
Redux开箱即用地提供一个组件来包装整个应用程序的原因。在文档中查看。这是Provider组件,当您用它包装整个应用程序时,只需将商店 一次 传递给组件:

import createStore from '../store';

const store = createStore()

class App extends Component {

  render() {
    return (
      <Provider store={store}>
        <MainAppContainer />
      </Provider>
    )
  }
}

如您在这里看到的,我为我的商店提供了一个单独的配置文件,因为您可以做很多修改,而对于任何远程复杂的应用程序,您都会发现自己在做类似的事情,例如使用compose来应用中间件。

然后,您剩下的任何“智能”组件(通常是包装器)都需要收听商店。这是使用connect方法完成的。这使您可以将状态片段映射到组件属性以及将操作作为属性进行分配。

import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import * as actionCreators from './actionCreators';

const mapStateToProps = function(state){
  return {
    something: state.something,
  }
}

const mapDispatchToProps = function (dispatch) {
  return bindActionCreators({
    getSomething: actionCreators.getSomething,
  }, dispatch)
}

class MainAppContainer extends Component {

    componentDidMount() {
      //now has access to data like this.props.something, which is from store
      //now has access to dispatch actions like this.props.getSomething
    }

    render() {
        //will pass down store data and dispatch actions to child components
        return (
               <div>
                   <ChildComponent1 something={this.props.something} />
                   <ChildComponent2 getSomething={this.props.getSomething} />
               </div>
        )
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(MainAppContainer)

由于您总是将调度操作和数据作为属性传递给子组件,因此您只需使用引用该组件上的子组件即可this.props

在上面的示例的基础上,您将看到由于我传递this.props.somethingChildComponent1,因此它可以访问something存储中的数据,但不能访问getSomething调度操作。同样,ChildComponent2只能访问getSomething调度操作,而不能访问something数据。这意味着您只能将组件完全暴露给商店所需的组件。

例如,由于ChildComponent2作为传递给了调度动作getSomething,在我中,onClick我可以调用this.props.getSomething,它将在
不需要对store的任何访问的情况下
调用调度动作。以相同的方式,它可以继续向下传递getSomething到另一个子组件,并且该组件可以调用它和/或向下传递它,并且循环可以无限期地继续。

class ChildComponent2 extends Component {

    render() {
        return (
            <div>
                <div onClick={this.props.getSomething}>Click me</div>
                <NestedComponent getSomething={this.props.getSomething} />
            </div>
        )
    }
}

从评论中编辑

尽管这与问题不直接相关,但在评论中您似乎对动作有些困惑。我实际上并未在getSomething此处定义操作。取而代之的是,在Redux应用程序中通常会将所有操作定义放在一个名为的单独文件中actionCreators.js。该函数包含的函数的名称与您的操作相同,并返回具有type属性和该操作所需的任何其他方法/数据的对象。例如,这是一个非常简单的示例actionCreators.js文件:

export function getSomething() {
    return {
        type: 'GET_SOMETHING',
        payload: {
            something: 'Here is some data'
        }
    }
}

减速器将监听此操作类型,以了解正在触发哪个操作。



 类似资料:
  • 问题内容: 有什么方法可以在JSON中嵌套对象,因此我不必从所有内容中制成数组?为了能够无错误地解析我的对象,我似乎需要这样的结构: 如果我将此对象提取到一个名为“结果”的变量中,则必须像这样访问嵌套的对象: 和 这对我来说似乎很笨拙和多余,如果可能的话,我希望: 和 但是,当一切都是数组时,如何直接使用对象键?在我困惑和未受教育的头脑中,这样的事情似乎更合适: 我可能在这里误解了一些基本知识,但

  • 问题内容: 那么,我真的需要了解它们吗?有没有一种有趣的方法来学习堆栈,链接列表,堆等?我觉得这很无聊。 **发布此问题时,它显示了一些警告。我不可以发布这样的问题吗?管理员请澄清,我将其删除:/ 警告::您要提出的问题似乎很主观,很可能已被关闭。 好吧..我明白了,学习它们的最好方法是什么?我要看什么书?什么网站? 问题答案: 如果您想成为一名程序员,则必须学习数据结构。数据结构是您的基础,如果

  • 我回到Java并回顾了我的一些旧代码,我看到了很多我已经做过的地方 或者从swing/awt包中实际导入特定类。我不记得是否需要导入java。awt.*在javax中使用任何东西。摇摆。*或者我会导入java。awt.*还有别的原因吗?换句话说,导入java的目的是什么。awt.*?我觉得使用JButton、JFrame等所需的一切都是javax。摇摆。

  • 问题内容: 我正在研究一个小的Java程序,并且正在使用数组,所以我做到了: 后来,我开始扩展以前做过的事情,并决定要从用户那里得到输入,因此我添加了: 现在发生了一个想法。我知道我可以这样做: 然后,我只需要1条导入行,而不是2条(或者我最终需要很多条),但是导入中的通配符是否意味着它将从该包中导入 所有内容 ,而不管是否需要它,或者仅将选择性功能被拉? 我的直觉是编写更多代码,仅包含我 知道

  • 问题内容: 我有以下代码: 在这种情况下,我需要mysql_real_escape_string还是可以吗? 问题答案: 不,在使用准备好的语句时,您不必自己逃避价值 (即,您不需要调用):DB引擎将自己执行该操作。 (实际上,如果您正在调用并使用绑定参数,则您的字符串将被转义两次- 并不是很好:您最终会到处转义字符…) 附带说明:您的值以整数形式传递 (如所示),因此即使您未使用准备好的语句,也

  • 问题内容: 我的Java应用程序依赖于DLL,而该DLL 进一步 依赖于。 我试过了: 将放置在文件夹中 并将文件夹放在%PATH% 然后,我遇到了从Eclipse启动应用程序时的问题。 但是如果我把它放进去了,就说。它工作正常。 但是我不想污染JDK文件夹。我记得Windows会搜索%PATH%来找到依赖的DLL。为什么在此问题中不能使用%PATH%? 更新1 Windows中有2个不同的%PA