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
react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法的更多相关文章
- 关于在React中 报Super expression must either be null or a function, not undefined (采坑系列)
今天突然在联系React中遇到一开始就报 Super expression must either be null or a function, not undefined 百度,各种方法,.. ...
- djang小项目过程中的小问题 02(跳转界面)
我觉着自己生下来就是解决问题的 ##1. 今天在使用登录注册模板时,输入后缀index,正常显示登录界面,但是点击 立即注册 之后不会跳转到注册页面 因为我观察到后缀名发生变化了,但是出发点是错的,前 ...
- 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter
PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...
- react中简单倒计时跳转
其实在react中实现倒计时的跳转方法有很多中,其中我认为较为好用的就是通过定时器更改state中的时间值. 首先在constructor中设置10秒的时间值: constructor () { su ...
- react跳转url,跳转外链,新页面打开页面
react中实现在js中内部跳转路由,有两种方法. 方法一: import PropTypes from 'prop-types'; export default class Header exten ...
- React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)
本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 中类 Vue 的控制指令,与指令式界面设计相关. 1. 指令式界面设计 Vue 与 A ...
- 总结PHP中几种常用的网页跳转代码
网页跳转的意思就是指当你在浏览器中访问A页面时,会自动跳转到B页面,往往网页跳转用在404页面中会比较多点.至于怎么实现网页跳转,网上已经提供了很多的方法,有些方法是不可行的,经过测试,叶德华今天就在 ...
- Web设计中打开新页面或页面跳转的方法 js跳转页面
Web设计中打开新页面或页面跳转的方法 一.asp.net c# 打开新页面或页面跳转 1. 最常用的页面跳转(原窗口被替代):Response.Redirect("newpage.aspx ...
- JSP中客户端跳转与服务器端跳转的区别
转载自:https://www.cnblogs.com/memewry/archive/2012/08/21/2649988.html 客户端跳转时用HttPservletResopse对象的send ...
随机推荐
- read write方式打开PHYSICAL STANDBY,闪回和还原测试
以下大部分都在STANDBY执行,主库执行(两次)的会提示 [STANDBY read write方式打开测试]检查standby状态SQL> SELECT NAME,DATABASE_ROLE ...
- Python .pyc的编译和反编译
1. 由Python文件编译为.pyc文件 python -m compileall apps.py 演示 2. .pyc的反编译,使用 uncompyle, 也可以使用网上在线的反编译工具 需要安装 ...
- coredump配置、产生、分析以及分析示例
关键词:coredump.core_pattern.coredump_filter等等. 应用程序在运行过程中由于各种异常或者bug导致退出,在满足一定条件下产生一个core文件. 通常core文件包 ...
- June 09th, 2019. Week 24th, Sunday
The beauty you see in me is a reflection of you. 你在我身上看到的美,正是你的倒影. From Jalaluddin Rumi. What we see ...
- Django3.0 前瞻 支持异步通信
最近两年,Django的版本号提升得特别快,2.0还没有多久,很快就要到3.0了. 让我们先看看官方的路线图和时间表: 版本号 发布日期 停止更新日期 停止维护日期 3.0 2019-12 2020- ...
- c++用流控制成员函数输出数据
#include<iostream> #include<iomanip> using namespace std; int main() { ; double b=314159 ...
- ubuntu升级pip报cannot import name 'main'解决方法
执行sudo vi /usr/bin/pip 将代码: from pip import main if __name__ == '__main__': sys.exit(main()) 修改为: fr ...
- 模拟ssh远程执行命令
目录 一.服务端 二.客户端 一.服务端 from socket import * import subprocess server = socket(AF_INET, SOCK_STREAM) se ...
- LeetCode | 2 的幂
LeetCode 题库的第 231 题 —— 2 的幂 这题也是比较容易的一题,前提是找到规律即可.如果从 10 进制的角度观察 2 的幂次方,可能并不容易发现规律,那么可以从 2 进制的角度进行观察 ...
- 创 PHP RSA2 签名算法
什么是RSA2 ? RSA2 是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法. 该算法比SHA1WithRSA有更强的安全能力. 为了您的应用安 ...