J'apprends Redux et j'ai mis en place un code simple qui utilise le magasin, l'action et le réducteur. J'utilise store.subscribe () pour écouter les modifications de l'état et l'utiliser pour mettre à jour mon état local.
ci-dessous est mon code complet dans index.js: p> Je veux utiliser REACT-REDUX pour éviter l'état local et l'abonnement. J'ai lu à propos de Connect () et MapStationtoProps () et. Mais je suis incapable de comprendre comment les utiliser dans mon code ci-dessous. Comment puis-je implémenter ces pièces dans mon code? P> p>
6 Réponses :
Utiliser le fournisseur de React-Redux et votre magasin sera disponible pour tous vos composants enfants
var store = createStore(changeState) <Provider store={store}> {child} </Provider>
ci-dessous est ce que vous devez faire, j'ai donné un exemple avec composant comp1 strong>,
Vérifiez également ce lien https://reux.js.org/basics/usage-with- Réagir aide à obtenir plus d'informations. import React from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';
import { connect } from 'react-redux'
class Comp1 extends React.Component {
increase = () => {
var action = {
type: 'INCREMENT',
qty: 1,
price: 100
}
store.dispatch(action);
}
render() {
return (
<button type="button" onClick={this.increase}>Increase</button>
)
}
}
mapStateToProps = state =>{
//code to map State to props
}
mapDispatchToProps = dispatch =>{
//code to map dispatch to props
}
export deafult connect(mapStateToProps,mapDispatchToProps)(Comp1);
Bien sûr, vous pouvez, d'abord, assurons-vous que des concepts sont clairs.
REDUX a déjà un «état», de sorte que vous la copiez sur votre état interne est redondant. p>
Vous manquez une partie clé de l'écaille ici, Quel est le redux's ... assez de chat de chit à droite, passons aux entreprises. P> Nous commençons avec les importations, obtenons tout ce dont nous avons besoin: p> Connectez ( ) code>:
Cette méthode de commodité est utilisée pour cartographier l'état du redux, aux accessoires de votre composant. C'est-à-dire que vous ne copiez pas l'état dans un autre État, vous utilisez l'état de Redux comme des accessoires qui sont intégrés et plus comme une référence aux données réelles à l'intérieur de Redux.
Il est construit avec un modèle d'appel hoc , mais c'est une leçon pour une autre question. La chose importante à savoir à propos d'un hoc est qu'il faut un composant comme un argument et qu'il renvoie un nouveau composant, une nouvelle composante, une amélioration d'une. P> MapStaTeToprops () code>:
Ce sera votre moyen de raconter connectez code> quelle partie de l'état de REDUX vous souhaitez entrer dans votre composant. C'est une méthode qui reçoit l'état complet de Redux, extrait les propriétés que vous souhaitez utiliser et les renvoie à être envoyé en tant que accessoires à votre composant. P>
Fournisseur Code>:
Cette pièce devrait envelopper toute votre application (ou la partie de celui -ble que vous souhaitez que ce soit sur le redux accès, qui est généralement tout cela) et est celui qui est responsable de l'envoi de l'enregistrement du magasin de Redux dans l'arborese, donc Connecter code> peut saisir la plus tard (ceci est réalisé via React's's contexte , mais c'est un repas pour un autre Date).
Vous obtenez votre fournisseur comme: importer {fournisseur} de 'React-redux'; code> et ensuite vous lui donnez le magasin comme un appel appelé ....
Store code> (juste intelligent ?) p>
class Comp2 extends React.Component {
render() {
return (
<div>
<h1>Total items in cart: {this.props.qty}</h1>
<h1>Total price of cart :{this.props.price}</h1>
</div>
)
}
}
function mapStateToProps( state ){
return { qty: state.qty, price:state.price }
}
Comp2 = connect(mapStateToProps)(Comp2);
C'est génial! Merci beaucoup. Bien que j'avais lu sur ces concepts, votre explication a rendu les choses très claires. Cependant, je reçois l'état comme indéfini dans le MapSTatetoprops ()? Pourquoi donc?
Cela peut être un problème lorsque vous avez défini le fournisseur, êtes-vous sûr que vous l'envoyez le Store code> comme un accessoire?
Ouais. J'ai fait exactement comme vous l'avez mentionné.
Eh bien, je ne peux imaginer aucun autre problème, si vous pouviez coller votre nouveau code dans CodePen, ou un gist ou quelque part, je pouvais lui donner un coup d'œil, je pourrais peut-être vous aider
Merci. Après avoir placé la déclaration Creeestore () après ma fonction de réducteur, l'erreur est partie. Mais quand je clique sur le bouton, rien ne semble arriver. J'ai placé mon index.js code ici: Codepen.io/anon/pen/mxnprm# Anon-Login
Trouvé votre petite erreur. Intérieur Comp2 Code> Changer
{this.props.cartqty} code> pour
{this.props.qty} code>. La même chose pour le prix. N'oubliez pas que le nom qu'ils ont dans les accessoires, provient de l'objet que nous sommes retournés à l'intérieur
MapStationetoprops Code>
Il y a peu de choses que vous devez prendre en charge.
premier fort>, vous devez avoir un réacteur-redux installé puis utiliser le composant de fournisseur au niveau supérieur à lequel vous passez magasin P> troisième strong>: vous devez rendre la connexion connectée Composants p> quatrième strong>: vous avez besoin de Store code> ou
Dispatch code> p>
MapStaTeToprops de code> à transmettre à un conteneur quelconque et
MapDisPatchToprops code> Pour accéder à l'envoi ou à l'action Créateurs disponibles comme accessoires aux composants. Si vous ne passez pas
MapDisPatchToprops code> à
Connectez code>, par défaut
Dispatch code> Prop est mis à la disposition du composant. Vous pouvez regarder le API Docs ici < / forte> p>
Merci pour votre réponse. Je suppose const Comp2Container = Connect (MapStatetoprops) doit être const Comp2Container = Connect (MapStatetoprops) (Comp2)? En outre, je reçois l'état comme non défini dans la fonction MapSTeTétoprops.
@CODINGSPLUSH, avez-vous utilisé un composant de fournisseur et avez passé le magasin
Oui. J'ai utilisé un composant de fournisseur et passez le magasin à celui-ci
Mise à jour de la réponse et ajouté une démo, vous devez créer une démonstration après avoir défini le réducteur et l'état initial autrement, il sera indéfini au moment de la création.
Merci. Maintenant, l'erreur est partie, mais quand je clique sur le bouton, rien ne se passe. Vous pouvez trouver mon code ici: codesandbox.io/s/x2zm26rv34
En effet, dans la fonction MapSTeTétoprops au lieu de définir la cartible et la carte de voiture, vous avez défini, Qté et prix. Les touches d'objet renvoyées par MapStationtoprops doivent être les mêmes que les propriétés utilisées des accessoires dans le composant
Code
import {combineReducers, createStore} from 'redux'; import {Provider, connect} from 'react-redux'; //reducer var initialState = { qty: 0, price: 0 } function cart(state = initialState, action) { switch (action.type) { case 'INCREMENT': var stateCopy1 = Object.assign({}, state); stateCopy1.qty = stateCopy1.qty + action.qty; stateCopy1.price = stateCopy1.price + action.price; return stateCopy1; default: return state; } } const rootReducer = combineReducers({cart}); //Actions const increase = () => { var action = { type: 'INCREMENT', qty: 1, price: 100 } } let Comp1 = (props) => { return ( <button type="button" onClick={props.increase}>Increase</button> ) } Comp1 = connect(null, {increment})(Comp1); let Comp2 = (props) => { return ( <div> <h1>Total items in cart: {props.qty}</h1> <h1>Total price of cart :{props.price}</h1> </div> ) } const mapStateToProps = ({state}) => state.cart Comp2 = connect(mapStateToProps)(Comp2); //create store const store = createStore(rootReducer); class Home extends React.Component { render() { return ( <Provider store={store}> <Comp1 /><br /> <Comp2 /> </Provider > ) } } ReactDOM.render(<Home />, document.getElementById('root'));
Tout d'abord, vous voulez développer un projet plus modulaire lorsque vous vous déplacez dans votre courbe d'apprentissage, ce sera plus facile pour vous.
Configurez un src / index.js code>, Vous avez déjà un fichier
index.js code> je dis que vous dites de faire que votre racine
index.js code> puis le refaite comme suit: p>
import { combineReducers } from "redux";
import locationsReducer from "./locationsReducer";
export default combineReducers({
locations: locationsReducer
});