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 ...
随机推荐
- redis5.0.4安装配置
1.下载redis wget http://download.redis.io/releases/redis-5.0.4.tar.gz 2.解压到opt目录 tar -zxvf redis-5.0.4 ...
- 高通电池管理基于qpnp-vm-bms电压模式
CV:Constant Voltage恒压 SMMB charger:Switch-ModeBattery Charger and Boost peripheral开关模式电池充电器和升压外围设备 O ...
- [Go] 在golang中使用正则表达式捕获子表达式
正则匹配并且可以捕获到()这个里面的子表达式的值,linux的grep命令没办法捕获子表达式的值,只能获取到整条正则匹配的内容 package main import "regexp&quo ...
- itest(爱测试) 4.2.1 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 入选 2019 年度最受欢迎开源中国软件 开源工具的发展,离不开你我的支持,需要您投上宝贵的一票 去投票 itest 简介:查看简介 itest 开源敏捷测试管理,testOps 践行者 ...
- 《Web Development with Go》实现一个简单的rest api
设计模式完了之后,应该实现具体的应用了. 设计模式还得没事就要复习. web应用,学习的是网上的一本书. <Web Development with Go> package main im ...
- CSS中层叠和继承的概念。
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: 1 2 3 4 5 6 7 8 9 <ht ...
- Mysql 免安装教程 百度云网盘有文件和word说明
一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建—>变量值是解 ...
- Unity Settings Deamon crash in 16.04 every time after boot
安装ubuntu 16.04的时候,出现这样一个错误: unity-settings-deamon crashed with SIGSEGV in up_exported_dae (can't rea ...
- Mysql 查看死锁,解除死锁 方式
解除正在死锁的状态有两种方法: 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则, ...
- 2018-8-10-win10-uwp-关联文件
原文:2018-8-10-win10-uwp-关联文件 title author date CreateTime categories win10 uwp 关联文件 lindexi 2018-08-1 ...