【问题标题】:mapStateToProps not updatingmapStateToProps 未更新
【发布时间】:2017-11-29 04:03:47
【问题描述】:

我刚刚开始使用 react/redux。我只想输入一些文本并点击提交,然后将其传递给另一个组件,该组件将显示输入的任何内容。

我知道我可以从 A 点到 B 点获取数据,因为如果我使用 store.subscribe 就可以访问状态并且它总是准确的。我正在尝试使用 mapStateToProps,但我没有任何运气。

我没有使用 mapDispatchToProps,所以这可能是个问题?我似乎找不到一个很好的简单例子。 mapStateToProps 似乎也只在我刷新页面(使用 webpack-dev-server)时才运行,因为它只在页面加载时记录一次,而不再记录。

_______________ Input.js _________________

import React from 'react';
import store from '../redux/store';
import { connect } from 'react-redux';
import { addSearchParam } from '../redux/actions';

export default class Input extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      player: ''
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({
      player: event.target.value
    });
  }

  handleSubmit(event) {
    event.preventDefault();
    store.dispatch(addSearchParam(this.state.player))
  }

  render() {
    return ( <form onSubmit = {this.handleSubmit} >
      <label>
          <input type="text" value={this.state.player} 
          onChange={this.handleChange}/> 
      </label> 
      <input type="submit" value="Submit" />
      </form>
    );
  }
}


_______________ Info.js _________________


import React from 'react';
import store from '../redux/store';
import { connect } from 'react-redux';

class Info extends React.Component {

  constructor(props) {
    super(props);
  }

  render() {
    return ( 
        <h2> {this.props.player}</h2>
    )
  }
}

function mapStateToProps(state) {
  console.log("mapStateToPropsInfo: ", state)
  return {
    player: state.player
  }
}

export default connect(mapStateToProps, null)(Info);


_______________ reducers.js _________________

'use strict';

import {
  combineReducers
} from 'redux';

const SEARCH_PARAM = 'SEARCH_PARAM';

const searchReducer = (state = '', action) => {
  if (action.type === SEARCH_PARAM) {
    return action.text;
  }
  return state;
}

export const reducers = combineReducers({
  searchReducer
})

export default reducers;


_______________ actions.js _________________

'use-strict';

export const addSearchParam = input => {
  return {
    type: 'SEARCH_PARAM',
    id: 'player',
    text: input
  }
}

_______________ index.js _________________
'use-strict';

import React from 'react';
import ReactDOM from 'react-dom';
import App from './js/App';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import reducers from './js/redux/reducers'

let store = createStore(reducers)

ReactDOM.render(
    <Provider store={store}>
        <App />
  	    </Provider>, document.getElementById('root')
);

这些似乎是与此问题相关的最重要的文件,但如果需要,我可以提供更多。谢谢你的帮助。希望我只是缺少一些简单的东西。

【问题讨论】:

  • 你没有定义player store,而是调用了state.player
  • 我编辑了 sn-p 以添加 index.js,如果这就是你的意思,它会创建商店?
  • 你能创建一个工作的sn-p吗?当我单击“运行”时,它会因“未捕获的语法错误”而失败。

标签: javascript reactjs react-redux


【解决方案1】:

我认为问题在于您写了actions,但从未使用/连接过它。您需要Input.js 中使用mapDispatchToProps

首先像这样在input.js中导入action

import { addSearchParam } from './actions';

像这样写mapDispatchToProps函数:

function mapDispatchToProps(dispatch){
    return bindActionCreators({addSearchParam}, dispatch);
}

然后,在Input.jshandleSubmit 函数中执行以下操作:

this.props.addSearchParam(this.state.player)                

另外,不要在清除时导出类,而是将Input.js的导出语句更改为也绑定mapDispatchToProps

export default connect(null, mapDispatchToProps)(Input);       

【讨论】:

  • 天哪,非常感谢。实际上,我之前已经完成了大部分操作,但无法使用 this.props.addSearchParam 找出 handleSubmit 函数,所以我放弃了它,哈哈。我不得不更改一些 prop 和 reducer 名称,但它现在可以工作了。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 2021-10-23
  • 1970-01-01
  • 2020-06-01
  • 2019-06-26
  • 2017-06-12
  • 2021-01-05
  • 2018-02-21
相关资源
最近更新 更多