Я настраиваю Redux в своей среде React, чтобы иметь возможность перемещать данные выбора пользователя между компонентами. Я хочу получить значение cart, найденное в моем файле Webshop.js:

import React, { Component } from 'react';
import{ Connect } from 'react-redux';

import Shirt from './shirt.jpg';


export default class addCart extends Component {
    constructor(){
        super();
        this.state = {value: 'medium'}
        this.handleClick = this.handleClick.bind(this);
        this.change = this.change.bind(this);
    }

    handleClick() {
        let cart = {price:0,item:"userselection",size:this.state.value};
        console.log(cart);
    } 

    change(e){
        this.setState({value: e.target.value})
    }

    itemSelection(){
        let userOrder = {price:0,item:"",size:""};
        let userItem = "";
        if (userItem == "shirt1") {
           let itemPrice = 20.00;
        }
    }


    render() {
        return (
            <div className='Webshop' id='Webshop'>
                <li id="Productlist">
                    <div className='Product'>
                      <img src={Shirt}></img>
                      <button onClick={this.handleClick} className="addit">Add to cart</button>
                      <select id="size" onChange={this.change} value={this.state.value}>
                        <option value="medium">Medium</option>
                        <option value="large">Large</option>
                        <option value="x-large">X-large</option>
                      </select>
                    </div>
                    <div className='Product'>  
                      <img src={Shirt}></img>
                      <button onClick={this.handleClick} className="addit">Add to cart</button>
                      <select id="size" onChange={this.change} value={this.state.value}>
                        <option value="medium">Medium</option>
                        <option value="large">Large</option>
                        <option value="x-large">X-large</option>
                      </select>
                    </div>
                </li>
            </div>
        );
    }
}

Затем я хочу получить это Cart значение и переместить его в другие компоненты, используя Redux. Так что это мой Redux store.js:

import { createStore, applyMiddleware } from 'redux';
import reducer from './reducers';
import thunkMiddleware from 'redux-thunk';
import {createLogger} from 'redux-logger';


var initialState = {
  data: [],
  url: "/api/comments",
  pollInterval: 2000
}

const store = createStore(
  reducer,
  applyMiddleware(
    createLogger(),
    thunkMiddleware
  )
);
export default store; 

Это мой actions.js:

export const ADD_CART = 'ADD_CART';

export function addCart(){
    return {
        type: ADD_CART,
        payload: item
    }
};

И мой reducers.js:

import {ADD_CART} from './actions';

export default reducer;

function rootReducer(state, action){
    switch(action.type)
        case ADD_CART:
            return  
}

Чтобы связать мой магазин с моими компонентами, я обернул все свои компоненты внутри тега <Provider> в моем app.js:

import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, IndexRoute, hashHistory } from 'react-router';
import {Provider} from 'react-redux';
import store from '../store';

import App from 'views/App';
import Home from 'views/Home';
import Webshop from 'views/webshop';
import Cart from 'views/webcart';



ReactDOM.render(
    <Router history={ hashHistory }>
        <Provider store={store}>
            <Route path='/' component={ App }>
                <IndexRoute component={ Home } />
                <Route path='Webshop' component={ Webshop } />
                <Route path='Cart' component={ Cart } />
            </Route>
        </Provider> 
    </Router>,
    document.getElementById('app') // eslint-disable-line
);

Как я могу установить, что возвращается в моем редукторе, чтобы я мог передать cart другим компонентам в моем приложении?

0
feners 27 Май 2017 в 18:32

2 ответа

Лучший ответ

Подключите ваш addCart компонент, используя connect из «act-redux », и дайте ему onCartAdd опору, чтобы отправить действие addCart в ваш Магазин.

import React, { Component } from 'react';
import { addCart } from './actions';
import { connect } from 'react-redux';

import Shirt from './shirt.jpg';

class WebShop extends Component {
  ...

  handleClick() {
    let cart = {price:0,item:"userselection",size:this.state.value};
    this.props.onCartAdd(cart);
  }

  ...
}

const mapDispatchToProps = (dispatch) => {
  return {
    onCartAdd: (cart) => {
      dispatch(addCart(cart));
    },
  }
}

export deafult connect(null, mapDispatchToProps)(WebShop);

addCart в вашем 'actions.js' должен принять item в качестве аргумента:

export const ADD_CART = 'ADD_CART';

export function addCart(iten){
    return {
        type: ADD_CART,
        payload: item
    }
};

Использование с React более подробно объясняет, как настроить mapDispatchToProps.

0
Ross Allen 27 Май 2017 в 20:14

Данные вашего приложения, которые будут использоваться несколькими компонентами, должны быть добавлены в store. Затем вы можете получить доступ к этим данным из любого компонента, используя connect.

Если вы хотите, чтобы cart были доступны для других компонентов, вы должны добавить его в свой магазин,

То есть

var initialState = {
  cart: "medium",
  data: [],
  url: "/api/comments",
  pollInterval: 2000
}

Затем вы можете использовать это значение в любом компоненте, используя connect.

И в вашем корневом редукторе измените это значение при отправке действия,

import {ADD_CART} from './actions';

export default reducer;

function rootReducer(state, action){
    switch(action.type)
        case ADD_CART:
            return {
             ...state,
             cart: action.payload
             }
}
0
Anurag Awasthi 27 Май 2017 в 16:43