zoukankan      html  css  js  c++  java
  • react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法

    在上一篇文章中说过了react中界面A跳到B,返回A,A界面状态保持不变,上篇中使用的是传统的localStorage方法,现在来使用第二种redux的state方法来实现这个功能

    现在我刚接触redux,所以可能一些高级方法不是很会用,这边使用的是很简单的方法。其实这两种方法原理差不多,都是通过进行保存原有数据或者重新加载数据来实现

    我这边以购物车的商品为简单的例子,大家可以根据自己的场景来增加,原理都是一样的

    首先在action.js中定义个保存你数据的方法

    // actions.js
    
    // 商品相关
    export  const ADD_To_CART = 'ADD_TO_CART';
    export  const DELETE_TO_CART ='DELETE_TO_CART';
    export  const UPDATE_TO_CART = 'UPDATE_TO_CART';
    /*数值相关*/
    export const ADD = 'ADD';
    export const SUB = 'SUB';
    /*标志相关*/
    export const FLAG = 'FLAG';
    export function addToCart(product,quantity,unitCost){   //我想要保存的商品列表
        return {
            type: ADD_To_CART,
            payload: {product,quantity,unitCost}
        }
    }
    export  function flag(flag){   //根据这个flag标志来判断是不是加载原有的数据还是重新请求数据
        return {
            type:FLAG,
            payload:{flag}
        }
    }

    redux文件夹里面有三个文件,一个是商品的,一个是标志的,一个是把这两个合并到一起的

    // src/reducers/cart-reducer.js
    import {ADD_To_CART, DELETE_TO_CART,UPDATE_TO_CART} from "../action";
    //初始化state
    const initialState = {
        cart: [
            {
                product: 'bread 700g',
                quantity: 2,
                unitCost: 90
            },
            {
                product: 'milk 500ml',
                quantity: 1,
                unitCost: 57
            }
        ]
    }
    export default function (state = initialState, action){
        switch (action.type) {
            case ADD_To_CART: {
                return {
                    ...state,
                    cart:[...state.cart,action.payload]
                }
            }
            case DELETE_TO_CART:{
                 return {
                    ...state,
                     cart:state.cart.filter((item,key)=>{
                         if(item.product!=action.payload.product){
                             return item;
                         }
                     })
                 }
            }
            case UPDATE_TO_CART:{
                return {
                    ...state,
                    cart:state.cart.map((item,key)=>{
                        if(item.product == action.payload.product){
                            return action.payload
                        }
                        else{
                            return item
                        }
                    })
                }
            }
            default : return state
        }
    }
    // src/reducers/flag-reducer.js
    import {FLAG} from '../action'
    export default function (state=false,action){
       switch (action.type) {
           case FLAG :
               return action.payload.flag
           default :
               return state
       }
    }
    import {combineReducers} from 'redux';
    import productReducer from './product-reducer';
    import cartReducer from './cart-reducer'
    import flagSlogn from './flag-reducer'
    const allReducer = {
        product:productReducer,
        shoppingCart : cartReducer,
        flagSolgn:flagSlogn
    }
    const rootReducer = combineReducers(allReducer);
    export default  rootReducer

    然后创建store.js

    import {createStore} from 'redux';
    import rootReducer from './reducer'
    let store = createStore(rootReducer);
    export default store

    在你的js界面中使用

    import React, {Component} from 'react';
    import store from '../store/store'
    import {addToCart, deleteToCart, updateToCart,flag} from "../store/action";
    import {Link} from 'react-router-dom';
    class Home extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                cart: [],
            }
        }
        componentDidMount() {if(store.getState().flagSolgn){ //判断是不是跳转了的按钮,点击了从子界面返回的时候就加载原有的数据
                this.setState({
                    cart:store.getState().shoppingCart.cart
                })
            }
            else{   //没有点击,就按照初始化的来
                this.setState({
                    cart:[]
                })
                store.dispatch(addToCart('Coffee 500mg', 1, 250));
                store.dispatch(addToCart('Flour lkg', 2, 440));this.setState({
                    cart: store.getState().shoppingCart.cart
                })
            }
    
        }
        addProduct(){
            store.dispatch(addToCart('Green Tea',5,25));
           this.setState({
                cart:store.getState().shoppingCart.cart,
             
            })
        }
        render() {
            const {cart} = this.state;
            return (
                <div>
                    <ul>
                    {
                      cart.map((item,key)=>{
                          return (
                              <li key={key}><ul><li>{item.product}</li><li>{item.quantity}</li><li>{item.unitCost}</li></ul></li>
                          )
                      })
                    }
                    </ul>
                    <Link to={{pathname:"/HomePage"}}>跳转子界面</Link>
                    <div>
                        <button onClick={this.addProduct.bind(this)}>增加</button>
                    </div>
                </div>
            )
        }
    
    }
    
    export default Home;

    子界面的内容可以随便写,毕竟你需要的只是,从子界面返回到父界面,父界面中状态保持不变的效果,你只需要的是在进入子界面的时候,改变这个flag就好了

    import React, {Component} from 'react';
    import store from '../store/store'
    import {add, flag, sub} from '../store/action'
    class HomePage extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                count:0
            }
        }
        componentDidMount() {
            store.dispatch(flag(true));  //父界面进入子界面的标志位
        }
    
        addCount(){
            store.dispatch(add(2));
            this.setState({
                count:store.getState().product
            })
        }
        subCount(){
            store.dispatch(sub(3));
            this.setState({
                count:store.getState().product
            })
        }
        render() {
            const {count} = this.state;
            return (
                <div>
                  子界面得到store
                    {store.getState().shoppingCart.cart[0].product}
                    <div>
                    <button onClick={this.addCount.bind(this)}>增加</button>
                    </div>
                    <div>
                    <button onClick={this.subCount.bind(this)}>减少</button>
                    </div>
                    <p>数值: {count}</p>
                </div>
            )
        }
    }
    export default HomePage;

    然后你可以在除此以外的其他界面把这个flag变为false,就好了

    注:这边推荐个初学者学习redux的例子,讲的很清楚了 https://segmentfault.com/a/1190000011474522?utm_source=tag-newest

  • 相关阅读:
    android 中ImageButton按下改变背景图片的效果
    Android根据Button状态(normal,focused,pressed)显示不同背景图片
    Android简单逐帧动画Frame的实现(三)
    Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
    美团点评云真机平台实践
    美团客户端响应式框架EasyReact开源啦
    MCI:移动持续集成在大众点评的实践
    如何基于深度学习实现图像的智能审核?
    Android自动化页面测速在美团的实践
    美团外卖iOS多端复用的推动、支撑与思考
  • 原文地址:https://www.cnblogs.com/yesu/p/10978592.html
Copyright © 2011-2022 走看看