首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >状态更改不会导致呈现。

状态更改不会导致呈现。
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

复制
相关文章
HTML篇(006)-title 与 h1 的区别、b 与 strong 的区别、i 与 em 的区
①title用于网站信息标题,突出网站标题或关键字,一个网站可以有多个title,seo权重高于H1;H1概括的是文章主题,一个页面最好只用一个H1,seo权重低于title。
齐丶先丶森
2022/05/12
4660
WordPress 教程:the_title() 与 the_title_attribute() 的正确用法
WordPress 提供了一个非常简单方便的函数来显示当前文章的标题,那就是:the_title()。这个函数经常被开发者在 header,post,page,loop,footer 里使用,这几乎是开发主题里最常用的函数之一,然而许多开发者并没有意识到这里有个地方并不应该使用此函数,那就是在 attributes 里,如:
Denis
2023/04/15
2.6K0
将Git与Github进行SSH连接
<!--more--> <a href="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=112763915,265947675&fm=26&gp=0.jpg" class="highslide" onclick="return hs.expand(this,{slideshowGroup:'images'})"><img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=112763915,265947675&fm=26&gp=0.jpg"></a> # Githu与Github 首先, - `Git`是一款免费、开源的分布式版本控制系统; - `Github`是用`Git`做版本控制的代码托管平台; 用一句话形容这二者的关系:Git是弓,你的代码是箭,Github是靶子。 Git是软件,它可在本地建立仓库,你写的代码的各个版本都可以存着 Github是网上仓库,你写的代码的各个版本都可以存着。 # 安装使用 ## 安装Git 1. 到[Git官网](https://git-scm.com/downloads)下载与你正在使用的操作系统(本文以`windows`为例)相对应的文件。一般地,选择`64-bit Git for Windows Setup`。 2. 安装时注意:勾选添加git到`环境变量`;在Windows Explorer Integration中勾选`Git Bash Here`。其余配置默认即可。 3. 安装完成后(可能需要**注销或重启**),在任意一个文件夹空白处右键,检查是否有`Git Bash Here`的选项。 ## 注册GitHub 到[GitHub官网](https://sqdxwz.com)注册一个账号。这里我以我的Github账号:`WangRongsheng` 为例进行演示。 ## 配置git与github关联 ### 设置邮箱和用户名 打开`Git Bash`(输入命令**均在Git Bash中进行**,以后不再声明),分别输入下列命令(输入一行命令后需要回车,以后不再声明): ```html git config --global user.name "WangRongsheng" git config --global user.email "603329354@qq.com" ``` 下面这一行设置可以增强输出命令的可读性: ```html git config --global color.ui auto ``` ### 用ssh生成公钥 输入: ```html ssh-keygen -t rsa -C "603329354@qq.com" ``` 回车之后会出现如下所示的输出,直接按回车即可: ```html Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa): (按回车键) Enter passphrase (empty for no passphrase): (按回车键) Enter same passphrase again: (按回车键) ``` 这样密钥文件就生成了,默认在用户目录下,如:`C:\User\xxx\.ssh\` 这个文件夹中。其中的xxx是你的windows用户名。 ### 将公钥添加到`github`中 1. 在`C:\user\xxx\.ssh\`文件夹中找到`id_rsa.pub`这个文件,用文本编辑器(如记事本)打开,复制里面的所有内容。 2. 登陆`github账号`,点击头像旁的`小三角`展开,点击`settings`-`SSH and GPG keys`-`New SSH key`,在`Title`中取一个名字(任意),`key`中粘贴你刚刚复制的内容。然后点击`Add SSH key`即可。 ### 测试是否关联成功 输入: ```html ssh -T git@github.com ``` 出现以下结果即为成功: ```html Hi WangRongsheng! You've successfully authenticated, but GitHub does not provide shell access. ```
王荣胜
2020/03/13
7110
img中alt与title辨析
HTML5学堂:img中alt与title有何不同?本文主要从表现在含义、浏览器中的表现以及对于网站seo优化程度三个方面进行辨析,接下来我们一起来看看。 示例代码: <img src="h5course.jpg" alt="蜡笔小新 属性alt的值" title="蜡笔小新 属性title的值"> 1、含义不同: img标签alt属性是当图片不存在时或加载失败时的替代文字(进行显示);img标签title属性是对图片的描述与进一步说明。 2、在浏览器中的表现不同: 在FF、chrome和IE8+中,当鼠标
HTML5学堂
2018/03/12
1.4K0
img中alt与title辨析
js 动态修改浏览器标签的 title
django 前后端不分离项目的话,js 放在 base.html 模板里,其他模板继承 base.html,就可以全部页面都有标签 title 变化的效果了。
卓越笔记
2023/02/18
5.3K0
滚动title
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>^_^欢迎浏览本网站</title> </head> <body> </body> <script type="text/javascript"> var position=0; var message='^_^欢迎浏览本网站'; var x=2*(60/messag
河湾欢儿
2018/09/06
4.3K0
如何将wordpress的the_title()进行大小写处理
  有时我们在做wordpress网站时需要将标题的大写字母改成小写字母或小写字母转为大写字母方便调用,那么要如何改造呢?我们知道Wordpress the_title()函数默认回显标题,标准写法是
ytkah
2019/10/11
1.2K0
Blog Template Title
原文地址http://soft.dog/2018/07/06/blog-template/
franket
2021/08/10
1.1K0
TOP-TITLE
<%@ page contentType="text/html; charset=gb2312" language="java"  %>  <%@ page import="java.sql.*" %> <%@ page import="java.text.ParsePosition" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.util.Date" %> <jsp:useBean id="result" 
一朵灼灼华
2022/08/05
1.3K0
Angular Title Service 详解
Angular Title Service 用于获取和设置当前 HTML 文档的标题。Title Service 提供了以下方法:
阿宝哥
2019/11/05
2.1K0
如何将ReactJS与Flask API连接起来?
构建既可扩展又引人入胜的现代 Web 应用程序需要使用相关技术。ReactJS和Flask是两个流行的框架,分别用于前端和后端开发。
很酷的站长
2023/08/11
5050
如何将ReactJS与Flask API连接起来?
Node.js 连接 MySQL
安装驱动 本教程使用了定制的 cnpm 命令进行安装: $ cnpm install mysql 连接数据库 在以下实例中根据你的实际配置修改数据库用户名、及密码及数据库名: test.js 文件代码: var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '123456', datab
陈不成i
2021/07/13
2.2K0
关于vue的title标签中出现的htmlWebpackPlugin.options.title
(3条消息) 关于vue的title标签中出现的htmlWebpackPlugin.options.title_cokoD的博客-CSDN博客 
跟着阿笨一起玩NET
2020/09/27
3K0
关于H1的位置
相信大多数人都偏向第一种方式:用于文章标题上,从文章的角度上看,用户进到内容页里,想看到的当然就是文章的内容,文章标题理所当然是最重要的、最应该突出的。
GhostZhang
2022/08/21
3190
Markdown 使用参考h1
Markdown是一种易读易写的标记语言。它能被生成HTML。Markdown的目标是:成为一种适用于网络的书写语言。
前端GoGoGo
2018/08/27
7080
Markdown 使用参考h1
ECharts标题 Title 配置
var myChart=echarts.init(document.getElementById('main')); //init初始化接口,返回ECharts实例,其中dom为图表所在节点 var option = { //标题 title : { show:true,//显示策略,默认值true,可选为:true(显示) | false(隐藏) text: '主标题',//主标题文本,'\n'
安德玛
2022/03/09
1.8K0
Android去掉title:windowNoTitle
但是以上文件改动生效的前提是Manifest.xml中的添加:android:theme=”@style/AppTheme”
全栈程序员站长
2022/07/19
1.6K0
Vue.js入门
Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。
Vincent-yuan
2020/07/06
1.8K0
Node.js 连接 MongoDB--查询分页和连接
如果要设置指定的返回条数可以使用limit()方法,该方法只接受一个参数,指定了返回的条数。
陈不成i
2021/07/13
2.2K0
点击加载更多

相似问题

在Jenkins CLI中添加作业

12

收到新作业时取消Jenkins作业

10

如果将Jenkins作业排队的TFS生成定义已取消,则取消Jenkins作业

129

Trigger Jenkins构建cli,嵌套作业

12

Jenkins -用于更改创建的Jenkins作业中的凭据的CLI/Rest API

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档