0
votes

Comment utiliser React-Redux pour éviter l'état local dans mon code?

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: xxx

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?


0 commentaires

6 Réponses :


0
votes

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>


0 commentaires

0
votes

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);


0 commentaires

5
votes

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>

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>

Vous manquez une partie clé de l'écaille ici, Quel est le redux's ...
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>

assez de chat de chit à droite, passons aux entreprises. P>

Nous commençons avec les importations, obtenons tout ce dont nous avons besoin: 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);


6 commentaires

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 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 Changer {this.props.cartqty} pour {this.props.qty} . 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



3
votes

Il y a peu de choses que vous devez prendre en charge.

premier , vous devez avoir un réacteur-redux installé puis utiliser le composant de fournisseur au niveau supérieur à lequel vous passez magasin

secondaire : Vous devez connecter les composants qui doivent accéder à Store ou Dispatch

troisième : vous devez rendre la connexion connectée Composants

quatrième : vous avez besoin de MapStaTeToprops à transmettre à un conteneur quelconque et MapDisPatchToprops Pour accéder à l'envoi ou à l'action Créateurs disponibles comme accessoires aux composants. Si vous ne passez pas MapDisPatchToprops à Connectez , par défaut Dispatch Prop est mis à la disposition du composant. Vous pouvez regarder le API Docs ici < / forte>

cinquième Créer un magasin après la définition du réducteur de changement de changestate et l'initialstate xxx

Démo de travail


6 commentaires

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



0
votes

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'));


0 commentaires

0
votes

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
});


0 commentaires