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 ...
随机推荐
- Android实现九宫拼图过程记录
算法老师给了一份关于九宫拼图的算法过程用C++写的,让我们自己封装,成为一个有图形界面的工程,我接触过android,c++的mfc,Java的图形界面JUI,网页的css.html.javascri ...
- iperf 一个测试网络吞吐的工具
在分布式文件系统开发和测试过程中,我们经常需要测试真实的网络带宽,来进行估测分布式系统的传输性能,所以我们要对现有的网络进行测试:Iperf 是一个网络性能测试工具.IPerf可以测试最大的TCP和U ...
- 使用sessionStorage获取值和设置值
<body><button id="btn1">设置值</button><button id="btn2">获取 ...
- JavaScriptES6中Map与对象、数组,JSON之间的相互转换
JavaScriptES6中Map与对象.数组,JSON之间的相互转换 https://blog.csdn.net/c__dreamer/article/details/82183130
- This compilation unit is not on the build path of java project (此编译单元不在java项目的生成路径上)
This compilation unit is not on the build path of a Java project 解决办法 索发现,大致是因为项目文件缺失. 解决办法:找到项目根目录 ...
- luogu5823 课表的排列
题目链接 problem 构造一个长度为\(2n\)的数列.满足: 1.[1,n]中每个数字恰好出现两次. 2.将所有相同数字之间相隔的数字个数排序后,得到公差为1的等差数列. 保证n为奇数. sol ...
- win10系统使用Telnet命令时提示“telnet不是内部或外部命令”
in10系统使用Telnet命令时提示“telnet不是内部或外部命令”问题的处理方案 win10系统使用的过程中很多用户会遇到使用Telnet命令时提示“telnet不是内部或外部命令”的问题,这样 ...
- css兄弟选择器,+ ~选择器的区别
壹 ❀ 引 实习生在写搜索框下拉提示时,遇到了不知道怎么解决的问题,所以来问我.效果不难,鼠标选中输入框(focus)时,展示搜索关键字相关提示,看了眼dom结构是这样的: 在她的理解里面,选中父元 ...
- 划词标注1——使用svg绘制换行文本并自动识别库中字典数据
业务需求 给出一段文本,自动识别出文本中包含的关键字信息,关键字是库里已知的数据,根据类型的不同显示出不同的颜色 业务分析 1)采用css:文本识别出来后,根据识别出的文本更改对应文本的dom,通过更 ...
- Python的条件锁与事件共享
1:事件机制共享队列: 利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题要求:readthread读时,writethread不能写:writethread写时,readthre ...