组件中的Redux状态

ercv8c1e  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(105)

我正试图弄清楚如何从Redux将Redux存储状态拉入我的组件。我把mapStateToPropsconnect连上了。但是,当我在App组件中单击按钮时,this.props中没有我的Redux值。

// React and Redux Const
const { Component } = React;
const { render } = ReactDOM;
const { Provider, connect } = ReactRedux;
const {createStore, combineReducers, bindActionCreators } = Redux;


function tweetReducer(state=[],action) {
    if(action.type === 'ADD_TWEET') {
        return state.concat({ id: Date.now(), tweet: action.payload})
    } else {
        return state;
    }
}

const rootReducer = combineReducers ({
    state: (state = {}) => state,
    tweets: tweetReducer
});

class App extends Component{
    buttonClicked() {
        store.dispatch({type: 'ADD_TWEET', payload: 'This is my first 
tweet!'});
        console.log(this.props)
    }
    render() {
        return (
            <div>
                <h5>Hello from App</h5>
                <button onClick={this.buttonClicked.bind(this)}>Button</button>
    
                <div>-------------------</div>
                <Display />
            </div>
         )
     }
}

class Display extends Component {
    render() {
        return (
            <div>
                <h3>Tweets:</h3>
                {this.props.tweets}
            </div>
        )
    }
}

function mapStateToProps(state) {
    console.log('mapping state to props')

    return {
        tweets: state.tweets
    }
}

let store = createStore(rootReducer)

render (
    <Provider store={store}>
        <App />
    </Provider>
    , document.querySelector('#app')
);
connect(mapStateToProps)(App)

console.log(store.getState());
qojgxg4l

qojgxg4l1#

看起来你有几个问题
首先,它有助于理解connect()(MyComponent)返回一个“ Package ”在“真实的”组件周围的新组件。在您的示例中,您在 * 呈现<App /> * 之后调用connect(),* 并且 * 您实际上并没有保存和使用connect()生成的组件。你需要的是这样的东西:

let store = createStore(rootReducer)

const ConnectedApp = connect(mapStateToProps)(App);

render(
    <Provider store={store}>
        <ConnectedApp />
    </Provider>
, document.querySelector('#app')
);

第二,连接组件的部分意义在于它实际上不应该直接引用存储。connect()可以接受第二个参数,称为mapDispatchToProps。如果您不提供mapDispatch参数,它将自动给予您的组件this.props.dispatch。所以,你的App组件应该看起来像这样开始:

class App extends Component{
    buttonClicked(){
        this.props.dispatch({type: 'ADD_TWEET', payload: 'This is my first tweet!'});
        console.log(this.props)
    }

这应该足以让App组件从Redux接收数据并分发操作。

nhaq1z21

nhaq1z212#

这就是您应该如何继续获取组件中的存储状态。
1)创建reducers文件夹并创建新文件index.js

/* reducers/index.js */

import { combineReducers } from "redux";
import tweetReducer from "./tweetReducer";

const rootReducer = combineReducers({
    tweets: tweetReducer
});

export default rootReducer;

/* reducers/tweetReducer.js */

function tweetReducer(state=[],action) {
    switch(action.type) {
        case 'ADD_TWEET': 
            return state.concat({ id: Date.now(), tweet: action.payload});
        default:
            return state;
    }
}

/* 组件/App. js */

import React, { Component } from 'react';
import { connect } from 'react-redux';
class App extends Component {
    buttonClicked() {
        this.props.store.dispatch({type: 'ADD_TWEET', payload: 'This is my first 
tweet!'});
        console.log(this.props)
    } 
    render() {
        return (
            <div>
                <h5>Hello from App</h5>
                <button onClick={this.buttonClicked.bind(this)}>Button</button>

                <div>-------------------</div>
                <Display />
            </div>
         )
     }
}
function mapStateToProps(state) {
   console.log('mapping state to props')
   return {
     tweets: state.tweets
   }
}
export default connect(mapStateToProps)(App);

/* 组件/Display. js */

import React, { Component } from 'react';
  export default class Display extends Component {
     render() {
        return (
            <div>
               <h3>Tweets:</h3>
               {this.props.tweets}
             </div>
        )
     }
  }

/*Main.js */

import React, { Component } from "react";
import { render } from "react-dom";
import { Provider } from "react-redux";
import { store } from "./store";

render(
    <Provider store={store}>
        <App store={store} />
    </Provider>,
    document.querySelector('#app')
);

/* store/index.js */

import { createStore, applyMiddleware, compose } from "redux";
import reducers from "../reducers";

const store = createStore(
    reducers,
    composeEnhancers(applyMiddleware())
);

export { store };

相关问题