gpt4 book ai didi

javascript - mapDispatchToProps 调度操作无法更新状态

转载 作者:行者123 更新时间:2023-11-28 11:21:16 26 4
gpt4 key购买 nike

在我的index.jsaddCoin行动正在发挥作用。

import { addCoin } from './reducer/portfolio/actions'

const element = document.getElementById('coinhover');

const store = createStore(reducer, compose(
applyMiddleware(thunk),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
));

store.dispatch(addCoin('bitcoin'));

何时 store.dispatch称为我可以在这里看到更新的状态。 enter image description here

但是,我不想从我的index.js 调用调度操作,而是从我的组件内部调用。

<小时/>

我的SearchCoin组件:

import React from 'react'
import { connect } from 'react-redux'
import * as R from 'ramda'
import * as api from '../../services/api'
import { addToPortfolio, findCoins } from '../../services/coinFactory'
import { addCoin } from '../../reducer/portfolio/actions'

const mapDispatchToProps = (dispatch) => ({
selectCoin(coin) {
return () => {
dispatch(addCoin(coin))
}
}
});

class SearchCoin extends React.Component {
constructor(props) {
super(props)
this.state = {
searched: []
};
// console.log('props', props);
this.close = this.close.bind(this);
}

componentDidMount() {
this.coinInput.focus();
this.handleChange = this.handleChange.bind(this);
this.clickCoin = this.clickCoin.bind(this);
}

handleChange() {
const text = document.getElementById('coin-search').value;
const search = (text) => this.setState({ searched: findCoins(text) });
const clearSearch = () => this.setState({ searched: [] });
text.length > 1 ? search(text) : clearSearch();
}

clickCoin(coin) {
console.log('clickCoin', coin);
// api.getCoin(coin.id).then((res) => {
// const apiCoin = R.head(res.data);
// addToPortfolio(apiCoin);
// });
this.props.selectCoin(coin);
this.props.closeSearch();
}

close() {
this.props.closeSearch();
}

render() {
const searched = this.state.searched.map((coin) => {
return (
<li key={ coin.id } onClick={ ()=> this.clickCoin(coin) }>
<div className="coin-logo">
<img src={ coin.logo }/>
</div>
<span>{ coin.name }</span>
</li>
);
});

return (
<div id="search-coin-component">
<input type="text"
id="coin-search"
className="coin-search-input fl"
placeholder="Search"
onChange={ ()=> this.handleChange() }
ref={ (input) => { this.coinInput = input; } } />
<div className="icon-cancel-outline fl" onClick={ this.close }></div>
<div className="coin-select">
<ul>
{ searched }
</ul>
</div>
</div>
)
}
}

export default connect(null, mapDispatchToProps)(SearchCoin)

这是 onClick:

<li key={ coin.id } onClick={ ()=> this.clickCoin(coin) }>

在文件底部,我使用 connect 添加 mapDispatchToProps

export default connect(null, mapDispatchToProps)(SearchCoin)

这是类方法clickCoin调用 this.props.selectCoin

clickCoin(coin) {
console.log('clickCoin', coin);
this.props.selectCoin(coin);
this.props.closeSearch();
}

最后selectCoin

import { addCoin } from '../../reducer/portfolio/actions'

const mapDispatchToProps = (dispatch) => ({
selectCoin(coin) {
return () => {
dispatch(addCoin(coin))
}
}
});

但是,当我单击按钮时,似乎没有触发调度,因为 redux 状态没有发生任何变化。 enter image description here

import * as R from 'ramda'
import * as api from '../../services/api'
import { addToPortfolio } from '../../services/coinFactory'

export const ADD_COIN = 'ADD_COIN'

export function addCoin(coin) {
console.log('addCoin', coin);
return dispatch =>
api.getCoin(coin)
.then((res) => addToPortfolio(R.head(res.data)))
.then((portfolio) => dispatch(add(portfolio)));
}

// action creator
export function add(portfolio) {
return {
type: ADD_COIN,
portfolio
}
}

reducer

import { ADD_COIN } from './actions'

const initialState = [];

export default (state = initialState, action) => {
switch(action.type) {
case ADD_COIN:
return action.portfolio;
default:
return state;
}
}

reducer/index.js

import { combineReducers } from 'redux'
import portfolio from './portfolio'

export default combineReducers({
portfolio
});

最佳答案

除了 azium 答案之外,您还可以使用这样的操作。它可以节省您一些写作时间,

export default connect(null, {addCoin})(SearchCoin)

你可以像这样使用它,

clickCoin(coin) {
console.log('clickCoin', coin);
this.props.addCoin(coin);
this.props.closeSearch();
}

关于javascript - mapDispatchToProps 调度操作无法更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com