Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Props在一次刷新中更新了3次

Props在一次刷新中更新了3次
EN

Stack Overflow用户
提问于 2020-06-26 12:19:45
回答 1查看 37关注 0票数 0

我是一个反应新手,我从一开始就尝试使用react-redux风格。下面是我为一个简单的产品列表页面所做的尝试。

在我的App.js中检查用户是否仍在登录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {}
  }

  componentDidMount() {
    if (isUserAuthenticated() === true) {
      const token = window.localStorage.getItem('jwt');
      if (token) {
        agent.setToken(token);
      }
      this.props.appLoad(token ? token : null, this.props.history);
    }
  }

  render() {
    const PrivateRoute = ({ component: Component, ...rest }) => (
      <Route {...rest} render={(props) => (
        isUserAuthenticated() === true
          ? <Component {...props} />
          : <Redirect to='/logout' />
      )} />
    )

    return (

      <React.Fragment>
        <Router>
          <Switch>
            {routes.map((route, idx) =>
              route.ispublic ?
                <Route path={route.path} component={withLayout(route.component)} key={idx} />
                :
                <PrivateRoute path={route.path} component={withLayout(route.component)} key={idx} />
            )}
          </Switch>
        </Router>
      </React.Fragment>
    );
  }
}

export default withRouter(connect(mapStatetoProps, { appLoad })(App));

在my action.js appLoaded中,操作如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const appLoad = (token, history) => {
    return {
        type: APP_LOAD,
        payload: { token, history }
    }
}

用于它的reducer.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { APP_LOAD, APP_LOADED, APP_UNLOADED, VARIFICATION_FAILED } from './actionTypes';

const initialState = {
    appName: 'Etsync',
    token: null,
    user: null,
    is_logged_in: false
}

const checkLogin = (state = initialState, action) => {
    switch (action.type) {
        case APP_LOAD:
            state = {
                ...state,
                user: action.payload,
                is_logged_in: false
            }
            break;

        case APP_LOADED:
            state = {
                ...state,
                user: action.payload.user,
                token: action.payload.user.token,
                is_logged_in: true
            }
            break;
        case APP_UNLOADED:
            state = initialState
            break;
        case VARIFICATION_FAILED:
            state = {
                ...state,
                user: null,
            }
            break;
        default:
            state = { ...state };
            break;
    }
    return state;
}

export default checkLogin;

在Saga.js中,我观察了每个appLoad操作,并按如下方式执行了操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { takeEvery, fork, put, all, call } from 'redux-saga/effects';

import { APP_LOAD } from './actionTypes';
import { appLoaded, tokenVerificationFailed } from './actions';
import { unsetLoggeedInUser } from '../../helpers/authUtils';
import agent from '../agent';
function* checkLogin({ payload: { token, history } }) {
    try {
        let response = yield call(agent.Auth.current, token);
        yield put(appLoaded(response));
    } catch (error) {
        if (error.message) {
            unsetLoggeedInUser();
            yield put(tokenVerificationFailed());
            history.push('/login');
        } else if (error.response.text === 'Unauthorized') {
            unsetLoggeedInUser();
            yield put(tokenVerificationFailed());
        }
    }
}

export function* watchUserLogin() {
    yield takeEvery(APP_LOAD, checkLogin)
}

function* commonSaga() {
    yield all([fork(watchUserLogin)]);
}

export default commonSaga;

之后,对于productLists页面,我的代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//importing part

class EcommerceProductEdit extends Component {

    constructor(props) {
        super(props);
        this.state = {}
    }

    componentDidMount() {
        **//seeing the props changes**
        console.log(this.props);
        this.props.activateAuthLayout();
        if (this.props.user !== null && this.props.user.shop_id)
            this.props.onLoad({
                payload: Promise.all([
                    agent.Products.get(this.props.user),
                ])
            });
    }

    render() {

        return (
            // JSX code removed for making code shorter
        );
    }
}

const mapStatetoProps = state => {
    const { user, is_logged_in } = state.Common;
    const { products } = state.Products.products.then(products => {
                    return products;
    });
    return { user, is_logged_in, products };
}

export default connect(mapStatetoProps, { activateAuthLayout, onLoad })(EcommerceProductEdit);

但在componentDidMount的这个页面中,如果我记录道具,我会在控制台中得到三次。如下

休息,一切都很好。我只是担心,我正在做的代码不符合标准。任何类型的见解都是高度赞赏的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 12:25:57

这是因为你有三个状态更新,不能批量渲染。

首先在没有数据的情况下渲染。您可以在第一个日志中看到这一点。没有用户,他们也没有登录。然后你就会得到一个用户。您可以在第二个日志中看到这一点。有一个用户,但他们没有登录。然后你让他们登录。您可以在第三个日志中看到这一点。有一个用户,他们已经登录了。

如果所有这些都是在单独的步骤中完成的,并在每个步骤中更新Redux存储,那么您将在每个步骤之间渲染。但是,如果您获得了用户,并将他们登录,然后在同一时间范围内以redux状态存储他们,那么您只会呈现额外的时间。请记住,React和Redux是高度异步的库,它们试图使用批处理来确保在同一时间框架内完成的事情只会导致一次渲染,但有时您需要同时处理多个网络步骤。所以你没有做错任何事,你只是有很多步骤不能很容易地放在同一个框架中,因为它们依赖于一些外部资源,这些资源有自己的异步获取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62594619

复制
相关文章
Excel公式应用的时候固定某些单元格不动
今天在做大物实验的数据分析的时候,出现了一个问题,根据gi的公式来算gi的时候,如下图所示:
灯珑LoGin
2022/10/31
1.1K0
Excel公式应用的时候固定某些单元格不动
Excel公式技巧90:剔除单元格区域中的空单元格
有时候,在一列数据中有许多空单元格,导致数据不连续,我们需要剔除这些空单元格,让数据区域连起来。
fanjy
2021/07/12
4.6K0
Excel公式技巧90:剔除单元格区域中的空单元格
Excel公式练习64: 获取单元格区域中移除空单元格后的值
导语:在前面的文章中有一些与本文类似的案例。要想熟练掌握一门技术,就是要不断地反复练习。
fanjy
2020/05/25
3.1K0
Excel公式练习64: 获取单元格区域中移除空单元格后的值
VBA技巧:当单元格区域中包含由公式返回的空单元格时,如何判断?
在VBA中,我们经常会遇到需要检查某个单元格区域是否为空的情形。我们可以使用下面程序中的代码来检查单元格区域是否为空。
fanjy
2022/06/04
2.3K0
Excel公式练习32: 将包含空单元格的多行多列单元格区域转换成单独的列并去掉空单元格
本次的练习是:如下图1所示,单元格区域A1:D6中是一系列数据,其中包含空单元格,现在要将它们放置到一列中,并删除空单元格,如图中所示的单元格区域G1:G13,如何使用公式实现?
fanjy
2020/02/18
2.4K0
Excel公式练习33: 将包含空单元格的多行多列单元格区域转换成单独的列并去掉空单元格(续)
本次的练习是:这个练习题与本系列上篇文章的练习题相同,如下图1所示,不同的是,上篇文章中将单元格区域A1:D6中的数据(其中包含空单元格)转换到单独的列(如图中所示的单元格区域G1:G13)中时,是以行的方式进行的,即先放置第1行中的数据、再放置第2行……依此类推。这里,需要以列的方式进行,即先放置第1列中的数据、再放置第2列中的数据……依此类推,最终结果如图中所示的单元格区域H1:H13,如何使用公式实现?
fanjy
2020/02/18
2.4K0
Excel公式技巧75:查清与公式相关的单元格
在使用Excel时,我们肯定会使用公式。这些公式要么会引用其他的单元格,要么会被其他单元格引用。下面我们先看看这两种情况,如下图1所示。
fanjy
2021/01/06
1.7K0
Excel公式技巧95:统计文本单元格的神秘公式
需要弄明白的是,空字符串与空单元格不同。空单元格中没有任何内容,空字符串是不显示任何结果的公式的结果。这通常是通过使用两个双引号来实现的,它们之间没有任何内容:
fanjy
2021/07/12
1.6K0
Excel公式技巧95:统计文本单元格的神秘公式
VBA: 禁止单元格移动,防止单元格公式引用失效
文章背景: 在工作生活中,存在文件共享的情况。在数据处理时,单元格公式中往往要引用原始数据源。多人操作时,每个人的操作习惯不同,如果数据源的单元格不小心被人为移动或删除,会导致单元格公式引用失效,产生#REF! 错误。如果进行的是跨表引用,这种错误往往还很难发现。
Exploring
2022/09/20
7870
为什么要将超声波感应用于无人机
无人机降落辅助是无人机所具有的一项功能,可以检测无人机底部与着陆区域的距离,判定着陆点是否安全,然后缓慢下降到着陆区域。尽管GPS监测、气压传感和其他传感技术有助于着陆过程,但在这个过程中,超声波传感是无人机的主要和最准确的判断依据。大多数无人机中还有悬停和地面跟踪模式,主要用于捕捉连续镜头和陆地导航,其中超声波传感器有助于将无人机保持在高于地面的恒定高度。
机器人网
2018/07/23
4670
为什么要将超声波感应用于无人机
VBA: 禁止单元格移动,防止单元格公式引用失效(2)
文章背景: 在Excel中,公式引用无效单元格时将显示 #REF! 错误。当公式所引用的单元格被删除或被粘贴覆盖时最常发生这种情况。
Exploring
2022/09/20
1.2K0
Excel技巧:使用上方单元格的值填充空单元格
有时候,工作表列中有许多空单元格,而不是在每行都重复相同的内容,这样可以使报表更容易阅读,然而也会导致一些问题,例如不方便排序或筛选数据。
fanjy
2022/04/13
3.4K0
Excel技巧:使用上方单元格的值填充空单元格
Excel公式技巧:颠倒单元格区域/数组
=SUMPRODUCT(A1:G1,N(OFFSET(A2:G2,0,7-COLUMN(A2:G2),1,1)))
fanjy
2023/02/14
9050
Excel公式技巧:颠倒单元格区域/数组
Excel 公式、图表以及单元格的操作
SUM 函数将值相加,可以将单个值、单元格引用或是区域相加,或者将三者的组合相加。例如: =SUM(A1:A3)将单元格 A1:A3 中的值加在一起,=SUM(A1:A3,B1:B3)将单元格 A1:A3 以及单元格 B1:B3 中的值加在一起。语法:SUM(number1,[number2],…),number1(必需):要相加的第一个数字。该数字可以是 4 之类的数字,A1 之类的单元格引用或 A1:A3 之类的单元格范围。number2(可选):要相加的第二个数字。可以按照这种方式最多指定 255 个数字。下面我们来看怎么通过 Python 使用 SUM 函数。代码如下:
芯动大师
2022/11/15
1.3K0
Excel 公式、图表以及单元格的操作
Excel小技巧88:保护公式单元格
Excel中的“保护工作表”功能使用起来有点奇怪,似乎有点烧脑。但是,你按照下面介绍的步骤,可以快速保护工作表中的公式单元格。
fanjy
2021/07/12
8290
Excel小技巧88:保护公式单元格
Excel技巧:锁定包含公式的单元格
有时候,我们想保护工作表中的公式,不让用户能够随便修改,但是又不想限制用户编辑除公式之外的数据。此时,不能够简单的使用“保护工作表”命令,稍微需要添加一点技巧来实现。
fanjy
2022/06/04
3.1K0
Excel技巧:锁定包含公式的单元格
Excel小技巧77:6个简单的方法,批量应用公式到整列
公式使电子表格“活”了起来。有时,我们会在一个单元格或者多个单元格中应用公式,但在很多情况下,我们需要将公式应用于整列(或者一列中的许多单元格)。为此,Excel提供了多种不同的方法,你只需使用鼠标单击几次或者使用快捷键,就可以完成这样的操作。
fanjy
2021/02/05
59K0
Excel公式技巧27: 在条件格式中使用公式来突出显示单元格
条件格式与公式相配合,往往能够发挥很大的威力,其中之一就是用来突出显示单元格。如下图1所示,在“新建格式规则”对话框中:
fanjy
2020/04/14
3.3K0
Excel公式技巧27: 在条件格式中使用公式来突出显示单元格
点击加载更多

相似问题

如何在非空字段中存储空值?

32

如何在excel中首先获得非空/空值

12

在Tapestry中呈现requestParameter

10

非空属性引用“我的控制器”中的空值或瞬态值。

14

如何在空向量中传递值?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文