私は貧困を学習し、反応し、私は小道具の初期化の良い習慣に関して少し問題があります。反作用と非同期のアクション解決での小道具の初期化
/pokemons/:name
をそして、ここで心配コンポーネントです:実際には
、私は次のようなルートをm個
import React from 'react';
import {connect} from 'react-redux';
import {showDetail} from './../../redux/modules/pokemons';
export class PokeDetail extends React.Component{
render(){
return(
<div>
{this.currentPokemon.name}
</div>
)
}
}
const mapStateToProps = state => ({
currentPokemon:state.pokemons.currentPokemon
});
export default connect((mapStateToProps),{
showDetail
})(PokeDetail);
事実は、私はすべてのときに知っていないということです/私のアプリの状態を変更するために私のアクションを送信するには。実際、currentPokemonの状態が変わり、私のアプリが動くように、いつ私の "showDetail( 'myPokemonName')"を送るべきですか?
私は可能であればいくつかの良い習慣を必要とするあなたの助け
おかげ
EDITは:m
My PokeView :
import React from 'react';
import {connect} from 'react-redux';
import {loadRemoteAction} from './../../redux/modules/pokemons';
import {Link} from 'react-router';
export class PokeView extends React.Component {
render(){
let i = 0;
return (
<div>
<h4>Super page</h4>
<button onClick={this.props.loadRemoteAction}>Start</button>
<ul>
{
this.props.pokemons.map(item => {
i++;
return <li key={i}><Link to={`/pokemons/${item.name}`}>{item.name}</Link></li>
})
}
</ul>
</div>
);
}
}
const mapStateToProps = state => ({
pokemons : state.pokemons.pokemons
});
export default connect((mapStateToProps), {
loadRemoteAction
})(PokeView);
マイアクション/減速:
import immutable from 'immutable';
/**
* Action part
*/
export const LOAD_REMOTE = 'LOAD_REMOTE';
export const SHOW_DETAIL = 'SHOW_DETAIL';
export function loadRemoteAction() {
return dispatch => {
fetch('http://pokeapi.co/api/v2/pokemon/')
.then(res => res.json())
.then(res => dispatch({
type:LOAD_REMOTE,
payload:res.results
}));
};
}
export function showDetail(name){
return {
type:SHOW_DETAIL,
payload:name
}
}
/**
* Reducer part
*/
const ACTION_HANDLER = {
[LOAD_REMOTE] : (state, action) => {
if(action.payload) return Object.assign({},state,{pokemons:state.pokemons.concat(action.payload)});
return state;
},
[SHOW_DETAIL] : (state, action) =>{
let currentPokemon;
for(const pkm of state.pokemons){
if(pkm.name === action.payload) currentPokemon = pkm;
}
if(action.payload) return Object.assign({},state,{currentPokemon:currentPokemon});
return state
}
}
const initialState = {pokemons:immutable.fromJS([]), currentPokemon:immutable.fromJS({name:''})};
export default function pokemonReducer (state = initialState, action) {
const handler = ACTION_HANDLER[action.type]
return handler ? handler(state, action) : state
}
私は実際にはリモートAPIからリストを読み込み、うまく動作します。事実、私は詳細ページの中に最初の小道具をロードできません(ポケモンは既に状態ツリーの中にリストでロードされています。私はそれをレデューサーの中に入れ、実際に選択されたポケモンで状態ツリーを変更します)しかし、私はページを変更するときにそれを取得する必要があります – mfrachet
あなたは何をしようとしているのか正確には分かりませんが、あなたの '{this.props.currentPokemon.name}'関数をレンダリングするか? – Nicole
正確に。最初から:私はポケモンのリストを取得する非同期アクションを行います。このようなアイテムをクリックすると、別のコンポーネントの/ pokemons /:nameにリダイレクトされました。事実、新しいコンポーネントは、情報を表示するために状態ツリー内の誰が現在のポケモンであるかを知る必要があります。そして、私は "SHOW_DETAIL"アクション(これはリストの中に良いポケモンを見つけて、それをcurrentPokemon状態オブジェクトに入れなければならない)の結果を渡す方法を知らない。 – mfrachet