Reactjs Redux:mapStateToProps 未在状态更改时渲染组件

2023-12-15

我在同一组件上有搜索过滤器和排序输入。我正在使用重新选择(选择器包)其中数据数组被过滤和排序。 mapStateToProps 正在更新每个搜索过滤器结果上的组件。但 mapStateToProps 在对数组进行排序后不会更新组件。

选择器/index.js

import { createSelector } from 'reselect'

const getListOfCategory = (state) => state.products.product
const getSearchText = (state) => state.products.searchText
const getSortValue = (state) => state.products.sortValue

export const getVisibleCategory = createSelector(
  [ getListOfCategory, getSearchText, getSortValue ],
  (ListOfCategory, searchText, sortValue) =>{
    if((searchText !== undefined) && (searchText !== null) && (searchText !== "")){
      return ListOfCategory.filter((val) => val.modelname.toLowerCase().includes(searchText.toLowerCase())).sort((a, b) => {
      if (sortValue === 'likes') {
        return b.modellikes - a.modellikes;
      }
      if (sortValue === 'views') {
        return b.modelviews - a.modelviews;
      }
      if (sortValue === 'brand') {
        return a.modelname > b.modelname ? 1 : a.modelname < b.modelname ? -1 : 0;
      }
    });
  }
  if(sortValue){
    return ListOfCategory.sort((a, b) => {
    if (sortValue === 'likes') {
      return b.modellikes - a.modellikes;
    }
    if (sortValue === 'views') {
      return b.modelviews - a.modelviews;
    }
    if (sortValue === 'brand') {
      return a.modelname > b.modelname ? 1 : a.modelname < b.modelname ? -1 : 0;
    }
  });

  }
}
)

这是我的反应组件。

import React from 'react';
import {connect} from 'react-redux';
import {getCategoryInfo,search,sortBy} from '../actions/productActions';
import {getVisibleCategory} from '../selectors';
import {Link} from 'react-router-dom';

 class SmartCategory extends React.Component{
   constructor(props){
     super(props);
     this.state={
       searchFilter:""
     }
     this.searchHandle=this.searchHandle.bind(this);
     this.sortHandle=this.sortHandle.bind(this);
   }

   searchHandle(e){
     this.setState({
      searchFilter:e.target.value
    });
    this.props.search(e.target.value);
   }

   sortHandle(e){
     this.props.sortBy(e.target.value);
   }

   componentDidMount(){
     this.props.getCategoryInfo(this.props.page,this.props.pageId);
   }

   componentWillReceiveProps(nextProps){
      if(nextProps.page !== this.props.page || nextProps.pageId !== this.props.pageId){
          this.props.getCategoryInfo(nextProps.page,nextProps.pageId);
      }
   }

  changeText(){
    if(this.props.categoryTitle != undefined){
      let categoryTitle=this.props.categoryTitle.charAt(0).toUpperCase() + this.props.categoryTitle.slice(1);
      categoryTitle=categoryTitle.split('_').join(' ');
      return categoryTitle;
    }
  }

render(){
  const {error,isLoading}=this.props
    if(error) return <ResourceNotFound error={error}/>;
    if(isLoading) return <div className="spinner"></div>;
    return (
      <div className="container-fluid mb-4 categoryWrapper">
        <div className="row mx-0 pt-4">
          <div className=" col-sm-2 col-md-2 col-lg-2 px-2">
            <div className="input-group mb-3">
              <div className="input-group-prepend">
                <span className="input-group-text" id="basic-addon1"><i className="fa fa-search" aria-hidden="true"></i></span>
              </div>
              <input type="text"
              className="form-control"
              placeholder="Search by brand"
              onChange={this.searchHandle}
              value={this.state.searchFilter}
               />
            </div>
          </div>
          <div className=" col-sm-2 col-md-2 col-lg-2 px-2">
            <div className="form-group">
              <select className="form-control" id="sel1"
              placeholder="-- Sort By -- "
              onChange={this.sortHandle}
              >
                <option disabled>-- Sort By --</option>
                <option value="brand" >Brand</option>
                <option value="likes">Likes</option>
                <option value="views">Views</option>
              </select>
            </div>
          </div>
        </div>
        <div className="row mx-0 py-3">
          {this.props.isLoading ? <div className="spinner"></div> : null}
            {this.props.product && this.props.product.map((product,i)=>
                <div className="col-sm-3 col-md-3 col-lg-3" key={product.id}>
                  <Link to={`/SmartView/${this.props.page}/${product.modelname}`} className="routeDecorator">
                    <div className="border mb-2 p-3 rounded ">

                        <span className="text-grey">
                        <span className="mr-2">
                        <i className="fa fa-thumbs-o-up" aria-hidden="true"> {product.modellikes}</i>
                        </span>
                        <span className="float-right">
                        <i className="fa fa-eye" aria-hidden="true"> {product.modelviews} views</i>
                        </span>
                        </span>
                    </div>
                  </Link>
                </div>
            )}
        </div>
      </div>
    );
  }
}

function mapStateToProps(state){
  const {isLoading,isLoaded,error,categoryTitle,product,searchText,sortValue} = state.products
    return {
        isLoading,
        error,
        product:getVisibleCategory(state) || product,
        categoryTitle
    }
}

export default connect(mapStateToProps,{getCategoryInfo,search,sortBy})(SmartCategory);

MapStateToProps对每次返回的值进行浅比较。浅比较将比较对象和数组的引用。排序时,数组会就地排序,因此引用不会改变。看sort。您可以通过返回对数组的新引用来证明这一点:

 return [...ListOfCategory.sort(a,b) // rest of sort code ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Reactjs Redux:mapStateToProps 未在状态更改时渲染组件 的相关文章

  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • ElectronJS ReferenceError:导航器未定义

    我正在尝试在电子上制作自定义标题栏 但是当我启动我的应用程序时 我遇到了 ReferenceError 导航器未定义 问题 请帮忙 这是我的 main js 中的代码片段 My Codes https i stack imgur com c
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 在vscode中使用reactjs报错

    在 Visual Studio 代码中使用 jsx 语法 Visual Studio代码报错 请帮我 谢谢 符号 例如 而不是这样做 return lt button className square gt TODO lt button g
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • Jquery,清除/清空 tbody 元素的所有内容?

    我认为这会相当简单 但似乎空方法无法清除我拥有的 tbody 如果有人知道执行此操作的正确方法 我将不胜感激 我只想删除 tbody 中包含的所有内容 到目前为止我正在尝试 tbodyid empty HTML table tbody tr
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460

随机推荐

  • 一个衬垫:从列表创建一个字典,以索引为键

    我想根据给定的列表创建一本字典 仅一行 字典的键将是索引 值将是列表的元素 像这样的事情 a 51 27 13 56 given list d one line statement one line statement to create
  • 以简单的方式导出到 Excel(但不是 CSV)

    昨天我发现了这个How To通过简单地生成 HTML 将数据导出到 Excel 电子表格 这似乎是一种直接导出带格式的单元格的方法 而仅使用 CSV 格式是无法实现的 我的想法是在Java应用程序中处理一些数据 将结果导出到Excel电子表
  • 为什么 JSLint 不允许在 for 循环中使用“var”?

    我的代码或 plovr 有问题 我去 JSLint 寻求帮助 然而 JSLint 似乎认为这是一个致命错误 并拒绝检查更多代码 for var i 0 i lt data length i 4 为什么 我喜欢这种宣告 我 的方式 如果您使用
  • 跟踪对象的“页面浏览量”或“点击量”数量?

    我确信有人有一个可插拔的应用程序 或教程 可以近似于此 但我很难找到它 我希望能够跟踪特定对象的 视图 数量 就像这里的问题一样 stackoverflow 上有一个 观看次数 如果用户没有登录 我不介意尝试放置 cookie 或记录 IP
  • Ant 使用了错误的 java 版本

    我正在使用 Ant 1 7 0 并安装了位于 JAVA HOME 中的 java 1 6 我想使用 java 1 5 构建一个项目 因此我已将 JAVA HOME 导出为我的 java 1 5 目录 java version 说 1 5 当
  • 为什么 CUDA 的示例 makefile 找不到 CUDA 库?

    我正在运行 Arch Linux 并已从存储库安装了 cuda sdk 和 cuda toolkit 我已经编译了 opt cuda sdk CUDALibraries 中的库 不 我通过在 opt cuda sdk C 中运行 make
  • 使用 Chapel 处理海量矩阵

    我最近偶然发现了 Chapel 我非常想尝试一下 我有一个双重问题 希望它能解决 我通常使用 Python 或 C 工作 当Java陷入困境时 我有两个矩阵I and V 两者都很稀疏 尺寸约为 600K x 600K 密度约为 1 首先
  • 在高清图像上应用 WebGL 滤镜会剪切图像 (fabric V2-beta-6)

    目前正在与面料2 0 6对高清图像应用滤镜 我需要在最短的时间内应用过滤器 为此 我使用 webGL 方法来应用过滤器 如下所述这里 fabric js 演示 如果您将其应用于大小 Original Image size 1 90 MB H
  • 为什么这段代码中图像下方有空格? [复制]

    这个问题在这里已经有答案了 我有以下代码 它允许红色从 a 元素中显示出来 为什么是这样 我本以为 a 元素只会扩展到内容的大小 但看起来它比这个大一点 请参阅此处的代码笔http codepen io anon pen soqEz HTM
  • React Js,我的输入在渲染时失去焦点

    嘿 我是 React js 新手 任何人都可以帮助回答这个问题 如何防止输入字段在打字时失去焦点 每次我在某个输入字段中输入内容时 该字段就会失去焦点 注 第一个 div 输入工作得很好 import React Fragment useS
  • UDF 返回的数组对于调用范围来说太大或太小

    以下函数将数组返回到工作表 我标记一个区域 键入我的函数并按 Ctrl Shift Enter 以使单元格填充记录集中的数据 但是 如果我的 CSE 函数的选定区域大于返回的记录集 我会收到 N A 如果较小 则不会发出任何警告 有没有简单
  • 将数据从表单传递到 yii2 中的控制器

    I am creating a page that has 3 fields product code startdate enddate When I click on the search button it should create
  • 如何使用 AJAX 替换 Rails 3 中的 div?

    我试图使用 RJS 替换 DOM 中的 div 这是我尝试过的代码 控制器有这个方法 def change render update do page page replace test id partial gt input locals
  • C# 使用正则表达式删除括号内的所有内容以及括号本身

    我有一个字符串 var schoolName University of Hawaii Maui Oahu Kaui 我想删除括号内的所有内容以及括号本身 以便字符串仅输出 夏威夷大学 我一直在寻找正确的正则表达式 但尚未找到执行此操作的解
  • 使NSPanel中的NSView成为无关键窗口状态的第一响应者

    是否可以在不提供 NSPanel 关键窗口状态 使主应用程序窗口退出关键 的情况下 为 NSPanel 内的 NSView 提供第一响应者状态 Thanks 好吧 我最终解决了这个问题 但是需要进行大量研究 因此我将在这里发布详细信息 以防
  • Java:创建临时文件并替换为原始文件

    我需要一些创建文件的帮助 我在最后几个小时尝试使用 RandomAccessFile 并尝试实现下一个逻辑 获取文件对象 创建一个具有相似名称的临时文件 我如何确保临时文件将在与给定的原始文件相同的位置创建 写入该文件 用临时文件替换磁盘上
  • Oracle 的 MySQL 等效会话变量

    在 MySQL 中 我可以使用单个 创建访问会话变量 初始化示例 set myVar true 一些包含此代码的触发器 if myVar is not true then execute something Oracle 10g 中的等效项
  • PrimeNG DataTable 自定义排序或过滤 (Angular 2)

    我在 PrimeNg Datatable 中的排序 过滤日期列中遇到问题 因为我正在显示日期 dd mm yyyy 字符串 如果使用模板显示 dd mm yyyy 则过滤器不能作为处理日期 ISO 格式的实际数据绑定的过滤器 如果从后端将数
  • 如何在 asp.net 的 datagridview 列中显示总和

    我有一个 datagridview 用于显示交易记录 datagridview 中的一列是 金额 网格视图代码enter code here
  • Reactjs Redux:mapStateToProps 未在状态更改时渲染组件

    我在同一组件上有搜索过滤器和排序输入 我正在使用重新选择 选择器包 其中数据数组被过滤和排序 mapStateToProps 正在更新每个搜索过滤器结果上的组件 但 mapStateToProps 在对数组进行排序后不会更新组件 选择器 i