Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >状态更改不会导致呈现。

状态更改不会导致呈现。
EN

Stack Overflow用户
提问于 2017-10-31 02:43:40
回答 3查看 163关注 0票数 1

我尝试了一段时间来创建一个使用React & Redux的应用程序。在应用程序启动时,<App>组件将从JSON中获取一些数据,然后调用reducer来设置接收到的数据的状态。到目前为止,这是可行的,在加载页面后不久,我就可以从JSON看到呈现的数据。

我现在要做的是使用一个<button>从我的帖子列表中选择一个特定的帖子,使用还原器和一个动作。我尝试了几种方法,但是组件的状态保持不变,或者返回的状态是操作的类型,原因很奇怪。有人能解释我做错了什么以及如何解决吗?

actions.js

代码语言:javascript
运行
AI代码解释
复制
export const select = () => {
  return { type: 'SELECT' }
};
export const fetchPosts = (posts) => {
  return { type: 'FETCH', posts }
};

reducer.js

代码语言:javascript
运行
AI代码解释
复制
const reducer = (state = { data: [], selected: []}, action) => {
  let posts = { data: [], selected: []};
  switch (action.type) {
    case 'FETCH':
      Object.assign(posts.data, action.posts);
      return posts;
    case 'SELECT':
      posts.data = [...state.data];
      posts.selected = ["autumn-eu-dolor-ac-velit"];
      return posts;
    default:
      return state;
  }
};

export default reducer;

App.js

代码语言:javascript
运行
AI代码解释
复制
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { select, fetchPosts } from './actions';

// App component
class App extends Component {
  constructor(props){
    super(props);
    this.state = { posts : this.props.posts }
  }
    // Fetch data from JSON file
    componentDidMount() {
    let _this = this;
    fetch("https://jsonbin.io/b/59f721644ef213575c9f6531")
    .then( response => response.json())
    .then( data => {
      let posts = { data: data, selected: [] };
      _this.setState({ posts });
      _this.props.fetchPosts(posts);
    });
  }
  // Render
    render() {
    let posts = '';
    if(this.state.posts && this.state.posts.data){
      if (this.state.posts.selected.length){
        posts = this.state.posts.data.filter(post => {if (this.state.posts.selected.includes(post.id)) return true; return false;}).map(post => {return <p key={"post_"+post.id}>{post.content}</p>;});
      }
      else {
        posts = this.state.posts.data.map(post => {return <p key={"post_"+post.id}>{post.content}</p>;});
      }
    }
    return (
      <div>
        <button onClick = {() => this.props.select()}>Select post</button>
        {posts}
      </div>
    );
  }
}

// Map state to props
const mapStateToProps = (state) =>{
  return { posts: state };
};


// Connect App
export default connect(mapStateToProps, {select, fetchPosts})(App);

index.js

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root'));

据我所知,我目前拥有的代码没有设置<App/>组件的<App/>,因此它不会重登。但是,使用setState()会导致一个与传递的action相等的对象,所以我非常肯定有什么地方出了问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-31 04:07:07

由于您使用的是Redux,我建议您使用道具而不是组件的状态。另外,我换了你的减速机让它工作。我添加了一个default_state (它对应于还原器中的posts变量),并修改了案例中的代码以使其工作:

代码语言:javascript
运行
AI代码解释
复制
default_state = {
  data: [],
  selected: [],
}

const reducer = (state = default_state, action) => {
  switch (action.type) {
    case 'FETCH':
      return default_state;
    case 'SELECT':
      return {
        ...state,
        selected: ["autumn-eu-dolor-ac-velit"]
      }
    default:
      return state;
  }
};

export default reducer;

为了处理您的操作,请使用this.props.dispatch。我建议您查找一些react + redux指南来查看工作流,然后将其应用到您的代码中。

票数 2
EN

Stack Overflow用户

发布于 2017-10-31 04:15:31

您似乎对redux是什么以及它与react组件之间的关系感到困惑,但是总的想法是正确的。在您的示例中,您要将json结果保存到组件的本地状态(这与redux无关),并且只在呈现方法中读取该本地状态。我将阅读整个redux教程,以详细了解这里提供的示例,特别是redux数据是如何从redux存储作为道具而不是状态传递到组件中的。完全放弃this.state和this.setState。

看一看减速器,因为您目前没有正确地做这件事,所以您正在完全重置状态。

您的SELECT操作也应该在post的某些标识符中进行,这样您就可以知道选择了哪个帖子。

<button onClick = {() => this.props.select()}>Select post</button>这没什么用吗?它没有引用一个帖子,它怎么知道选择哪个帖子?在每个post中都有这个按钮,并将post id传递给select函数。

票数 2
EN

Stack Overflow用户

发布于 2017-10-31 04:29:36

当您单击select时,您的应用程序正在重新呈现,但是当发生这种情况时,它是更新的道具,而不是状态。在这里使用redux的方式,根本没有理由使用组件状态。只需将应用程序中的所有this.state切换到this.props即可。此外,对象分配是不必要的,您可以只使用return action.posts;

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

https://stackoverflow.com/questions/47033396

复制
相关文章
Qt状态更改事件
可以捕获的状态有: QEvent::ToolBarChange (在macOS上工具栏按钮被切换) QEvent::ActivationChange (顶级窗口激活状态已更改) QEvent::EnabledChange (窗口的启用状态已更改) QEvent::FontChange (窗口的字体已更改) QEvent::StyleChange (窗口的样式已更改) QEvent::PaletteChange (窗口的调色板已更改) QEvent::WindowTitleChange (窗口的标题已更改) QEvent::IconTextChange (窗口的图标文本已更改(不赞成使用)) QEvent::ModifiedChange (窗口的修改状态已更改) QEvent::MouseTrackingChange (鼠标跟踪状态已更改) QEvent::ParentChange (窗口的父类已更改) QEvent::WindowStateChange (窗口的状态"最小化、最大化或全屏"已更改) QEvent::LanguageChange (应用程序翻译已更改) QEvent::LocaleChange (系统区域设置已更改) QEvent::LayoutDirectionChange (默认应用程序布局方向已更改) QEvent::ReadOnlyChange (窗口的只读模式已更改)
Qt君
2023/03/17
1.1K0
Qt状态更改事件
Android系统更改状态栏字体颜色
原文地址:http://blog.isming.me/2016/01/09/chang-android-statusbar-text-color/,转载请注明出处。 随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面。我们可以进行更多的定制化了,然而有的时候我们使用的是淡色的颜色比如白色,由于状态栏上面的文字为白色,这样的话状态栏上面的文字就无法看清了。因此本文提供一些解决方案,可以是MIUI6+,Flyme4+
非著名程序员
2018/02/02
2.6K0
LayUI switch 开关监听 获取属性值、更改状态
背景 今天在设计页面时,想使用一下 LayUI 的 switch 控件,在需要更改状态的时候进行 ajax请求传输 需要获取其中的自定义属性值,同时根据服务器返回数据进行状态的更改 通过参考文档及网友
泥豆芽儿 MT
2019/03/20
20.1K0
LayUI switch 开关监听 获取属性值、更改状态
Laravel5.8 状态值无刷新更改
本文采用CC BY-NC-SA 3.0 Unported协议进行许可,转载请保留此文章链接
Meng小羽
2019/12/24
1.3K0
网页切出当前标签页时更改标题状态
浏览器里当用户切入或切出当前标签页时,会触发visibilitychange事件(IE10以下浏览器不兼容)。 这个事件能很好的解决页面在不可见的情况下,通过状态判断针对性减少网络请求、服务器压力等。 废话不多说,直接上js
小唐同学.
2022/02/23
1.9K0
黑马瑞吉外卖之售卖状态的更改
基本上在套餐这里的模块我们只剩下简单的对售卖状态更改了。停售,启售,批量停售,批量启售。
兰舟千帆
2022/10/04
7580
黑马瑞吉外卖之售卖状态的更改
🔥不会状态机?不知道状态模式?不会利用它来减少if else?来看看这篇文章!!!
状态模式大家可能初听会很陌生,这种模式有什么用?我就是个CRUD BOY,面对不同的状态,我一个状态一个状态的判断,if else、if else...... 不断的来写不同的逻辑它不香吗?
chinotan
2020/05/11
1.6K0
Etwin 数字孪生平台——设备真实状态的三维呈现
数字孪生的主要概念为:利用物理模型、物联网以及数据科学等技术,在虚拟空间中对实体装备进行映射,该技术作为物理世界与数字世界沟通的桥梁,能够帮助我们理解和利用复杂系统,广泛应用于航空航天、工业装备以及教育等领域。
联远智维
2023/06/01
6500
Etwin 数字孪生平台——设备真实状态的三维呈现
更改默认DNS导致内网域名解析异常,继而导致内网服务异常,如何解决?
更改默认DNS后,激活等内网域名相关的服务比如云监控、云镜、ntp、update 等通过加hosts方式实现
Windows技术交流
2021/09/17
7.9K0
Nginx更改默认根目录导致403 forbidden问题解决
在CentOS 6.4下安装好了Nginx后, 将根目录改到了自己的家目录下:/home/chenjiebin/www,结果访问提示403 forbidden,这个问题不就是没有权限吗?于是将www目录设置成777,本来以为应该没有问题了,结果一访问还是403,非常奇怪。
星哥玩云
2022/06/30
1.8K0
不会状态机?不知道状态模式?不会利用它来减少if else并解耦?来看看这篇文章!!!
状态模式大家可能初听会很陌生,这种模式有什么用?我就是个CRUD BOY,面对不同的状态,我一个状态一个状态的判断,if else、if else...... 不断的来写不同的逻辑它不香吗?
chinotan
2022/01/04
4840
不会状态机?不知道状态模式?不会利用它来减少if else并解耦?来看看这篇文章!!!
一种不会导致资源泄露的“终止”线程的方法
        在项目工程中,我们可能会使用第三方开发的模块。该模块提供一个接口用于完成非常复杂和耗时的工作。我们一般不会将该API放在UI线程中执行,而是启动一个线程,用工作线程去执行这个耗时的操作。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
6140
FileSystemWatcher类监控文件的更改状态并且实时备份文件
首先这是我自己在一个任务需求里面所要用到的,大致的代码如下:我把监视文件和备份文件的方法封装到一个WatcherAndBackup
ryzenWzd
2022/05/07
9190
EMLOG更改后台地址导致微语表情不显示解决方法
解决办法: 在include/lib/function.base.php中找到一下代码 /** * 替换表情 * * @param $t */ function emoFormat($t){ $emos = array('[耶]'=>'0.gif', '[呵呵]'=>'1.gif', '[悲伤]'=>'2.gif', '[抓狂]'=>'3.gif', '[衰]'=>'4.gif', '[花心]'=>'5.gif', '[哼]'=>'6.gif', '[泪]'=>'7.gif', '[害羞]
奶糖味的代言
2018/04/12
6770
python 数据图表呈现
平时压力测试,生成一些数据后分析,直接看 log 不是很直观,前段时间看到公司同事分享了一个绘制图表python 模块 : plotly, 觉得很实用,利用周末时间熟悉下。
orientlu
2018/09/13
1.2K0
python 数据图表呈现
热议!ChatGPT的出现会不会导致底层程序员失业?
来源:zhihu.com/question/570596331/answer/2861569894 首先问问 ChatGPT ,它给出的回答是: 随着越来越多的人加入 ChatGPT,也会使它多的能力越来越完善,这就是AI的特点,就目前 ChatGPT 的表现来看,已经可以替代大部分简单的CRUD,随着它的完善,对程序员的工作我相信是有一定的冲击的,最直接的就是导致大量底层程序员的失业。 言归正传,我直到最近才有时间体验ChatGPT,体验之后感觉现阶段的ChatGPT已经有以下几个比普通人强的点。 一、
程序猿DD
2023/02/24
4660
热议!ChatGPT的出现会不会导致底层程序员失业?
热议!ChatGPT的爆火会不会导致程序员失业?
最近,ChatGPT这个词在网上频繁出现,有关它的多个话题登上热搜,引发网友热议。那么,火爆全球的ChatGPT究竟是什么?
会呼吸的Coder
2023/03/03
8570
热议!ChatGPT的爆火会不会导致程序员失业?
容器网络防火墙状态异常导致丢包排查记录
作者杨玉玺,2011年至今一直从事底层网络研发,目前就职腾讯云 TKE 团队,专注 K8s 底层网络。先后就职于阿里云、金山云从事 VPC 虚拟化网络研发,对高性能网络优化,复杂网络问题排查有非常丰富的经验。 导语 K8s容器网络涉及诸多内核子系统,IPVS,Iptable,3层路由,2层转发,TCP/IP协议栈,这些复杂的内核子系统在特定场景下可能会遇到设计者最初也想不到的问题。 本文分享了iptable防火墙状态异常导致丢包的排查记录,这个排查过程非常曲折,最后使用了在现在的作者看来非常落伍的工具:sy
腾讯云原生
2022/04/14
1.4K0
容器网络防火墙状态异常导致丢包排查记录
DevExpress数据绑定呈现
数据库这里为了方便演示,用的SQL Server 由于我数据库中的表有8列数据,这里添加8列,并设置列名和绑定的数据名称:
别团等shy哥发育
2023/02/27
1.7K0
DevExpress数据绑定呈现
【Flutter 技能篇】你不得不会的状态管理 Provider
本文首发于政采云前端团队博客:【Flutter 技能篇】你不得不会的状态管理 Provider https://www.zoo.team/article/flutter-and-provider
政采云前端团队
2021/01/28
3.8K0

相似问题

React状态更改不会导致重新呈现

115

响应状态更改不会导致重呈现。

30

React状态更改不会导致组件重新呈现

21

状态更改不会导致在函数组件中重新呈现

27

状态列表更改不会导致重新呈现Next.js/React

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档