如何以正确的方式读取组件内的 redux 状态?

Posted

技术标签:

【中文标题】如何以正确的方式读取组件内的 redux 状态?【英文标题】:How to read redux state inside a component the right way? 【发布时间】:2019-12-15 13:26:18 【问题描述】:

我无法理解如何将组件与我的 redux 状态连接(以正确的方式)

到目前为止,我尝试使用 mapStateToProps,但完全不知道之后数据存储在哪里,我什至设法在构造函数中获取了一个实例,但在其他组件中也感觉不对(以奇怪的方式构建)我看到程序员只是凭空提取状态,但在我的组件(这是一个扩展“组件”的类)中,我只能通过手动更改 mapStateToProps 中的每个更改来获得所需的结果。

我尝试获取状态的组件(检查 mapStateToProps 中的注释,这就是我想要的)

import React,  Component  from "react";
import  connect  from "react-redux";
import initCreate from "../../actions" 

const mapDispatchToProps = dispatch => 
    return 
        initCreate: () => dispatch(initCreate())
    ;
;
const mapStateToProps = state => 
    //this.state.toggleCreate = state.reduction.toggleCreate;  <= seems to work, but feels wrong? is this how it's done in react? 
    return state.reduction;
;
class CrudBar extends Component 
    constructor(reduction) 
        super();
        this.state =  toggleCreate: false;
        this.create = this.create.bind(this);
    
    create() 
        this.props.initCreate();
        setTimeout(() => 
            console.log('state in component', this.state); // prints the state unchanged
        , 1000);
    

    render() 
        return (
            <div>
                <button onClick=this.create>Create</button>
            </div>
        )
    

const toolBar = connect(mapStateToProps, mapDispatchToProps)(CrudBar);
export default toolBar;

actions.js

export const addCategory = category => ( type: "ADD_CATEGORY", payload: category );
export const initCreate = state => ( type: "CRUDBAR_CREATE", payload: state );

我的减速机:

const initialState = 
    toggleCreate: false,
;
const reductionReducer = (state = initialState, action) =>
    switch (action.type) 
        case "CRUDBAR_CREATE":
        console.log('here') // printed
        setTimeout(() => 
            console.log('redux state', state); // prints the state changed
        , 1000);
            return 
                toggleCreate: !state.toggleCreate,
            ;
        default:
            return state;
    
;
export default reductionReducer;

程序员凭空提取状态的代码:

import React from "react";
import  connect  from "react-redux";

const mapStateToProps = state => 
    return state.categories;
;

const CategoriesList = ( categories ) => ( // I want something like this, to get the information and render accordingly
    <ul>
        
             categories.map(el => (
            <li key=el.id>
            /* Name, Address, Coordinates, and Category. */
               Name - el.name
            </li>
        )) 
    </ul>
);
const List = connect(mapStateToProps)(CategoriesList);
export default List;

我希望组件从 redux 中读取状态, 而且我想以正确的方式做到这一点,而不是其他程序员不得不跳舞和畏缩的廉价技巧。

【问题讨论】:

【参考方案1】:

要使用 redux 状态,您需要从 store 中获取它并将其注入到组件 props 中。

你这样做的方法是首先创建一个函数,它返回你在特定组件中需要的 redux 状态,像这样

const mapStateToProps = (pieceOfReduxState, anotherPieceOfReduxStete) =>
    (pieceOfReduxState, anotherPieceOfReduxStete)

这会返回2个redux状态

然后你将它作为第一个参数注入到连接函数中

connect(mapStateToProps)(ComponentName)

这将使 redux 存储在您的组件道具中可用

然后通过访问this.props.pieceOfReduxState在您的组件中使用它

希望这会有所帮助。

【讨论】:

以上是关于如何以正确的方式读取组件内的 redux 状态?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase/React/Redux 组件有奇怪的更新行为,状态应该没问题

ReactJS表单应用程序:如何阻止父组件重新渲染? /使用redux共享状态的正确方法

我的 Redux 状态发生了变化,为啥 React 没有触发重新渲染?

如何将操作发送到 redux-devtools 存储以从组件导入状态?

在 React Redux 中如何构建应用程序以将组件与状态原子解耦

react+redux 中预加载组件数据的正确方法