React项目知识积累(四)

1.useMemo( )

在 React 中,useMemo 是一个 Hook,用于记忆计算结果,只有当依赖项之一发生变化时,才会重新计算。这有助于避免不必要的计算和渲染,从而提高应用程序的性能。

基本语法如下:

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

在这个例子中,computeExpensiveValue 是一个可能很昂贵的计算函数,它依赖于参数 abuseMemo 的第一个参数是一个函数,该函数在组件首次渲染时执行,并返回想要记忆的值。第二个参数是一个数组,包含了这个函数的依赖项。只有当数组中的任何值发生变化时,computeExpensiveValue 函数才会重新执行。

useMemo 特别有用在处理复杂计算、大型对象或数组时,它可以防止不必要的重复计算,从而节省性能。

例如,假设你有一个计算两个数相加的函数,并且你想要在组件中记忆这个结果:

import React, { useState, useMemo } from 'react';

function MyComponent({ initialNumber }) {
  const [number, setNumber] = useState(initialNumber);
  const [number2, setNumber2] = useState(initialNumber + 1);

  const sum = useMemo(() => number + number2, [number, number2]);

  return (
    <div>
      <p>Number: {number}</p>
      <p>Number2: {number2}</p>
      <p>Sum: {sum}</p>
      <button onClick={() => setNumber(number + 1)}>Increment Number</button>
      <button onClick={() => setNumber2(number2 + 1)}>Increment Number2</button>
    </div>
  );
}

在这个例子中,sum 是通过 useMemo 记忆的,它只有在 numbernumber2 发生变化时才会重新计算。这样,只要 numbernumber2 的值保持不变,sum 的值就不会改变,从而节省了性能。

useMemo 是一个强大的性能优化工具,但使用时需要谨慎,因为它可能会隐藏潜在的性能问题,使代码更难维护。在决定使用 useMemo 之前,最好先考虑是否真的需要它。

const subMit = useMemo(()=>{
  return dataValue?.map(()=>{
  return { data };
    });
  },[ date ]);

2. :global{  }

在CSS中,:global 伪类用于选择器匹配文档中的所有元素,而不考虑它们是否位于一个特定的作用域内。这通常用于在CSS中引入外部的CSS文件或定义全局样式。

使用 :global 伪类,你可以确保选择器不会与当前组件或作用域内的任何本地选择器冲突。这对于使用CSS预处理器或模块化CSS时非常有用,因为它可以帮助避免命名空间的冲突。

下面是一个使用 :global 伪类的例子:

/* 在组件内部使用:global来引入全局样式 */
.global-class {
  color: red;
}

/* 或者在组件外部定义全局样式 */
:global .global-class {
  color: blue;
}

//局部作用
.bankenName{
  :global{
    .ant-divider-horizontal{
    font-size:16px !important;
    }
  }
}

在这个例子中,.global-class 是一个全局定义的类,它不会与组件内部定义的相同类名产生冲突。.global-class 会选择文档中的所有具有该类名的元素,并应用蓝色文字样式。

请注意,:global 伪类在不同的CSS处理器和预处理器中可能有不同的支持程度。在Sass中,你可以使用 @global 指令来实现相同的功能。

在 CSS Modules 中,通常情况下,样式是局部作用域的,即只应用于特定的组件或模块。但有时你可能需要定义一些全局样式,例如重置默认样式或设置全局主题。这时,可以使用 :global{ } 来定义全局样式规则。

3.自定义函数方法

在一个页面定义多个函数方法,在另一个页面调用。

//自定义组件的页面,可以定义多个组件,灵活调用
export const skipToElement = (elementId) => {
  const element = document.getElementById(elementId);
  if (element) {
    element.scrollIntoView({ block: 'start', behavior: 'smooth' });
  }
};

export const routes = {
  homePage: {
    label: <div>首页</div>,
    key: 1,
    neme: 'home',
    Children: [{ key: value }, { key: value }],
  },
  snowball: {
    label: "snow",
    key: 2,
    neme: 'snow',
    Children: [{ key: value }, { key: value }],
  },
};


//另一个页面调用函数
import {routes , skipToElement} from '../../../../../base';

const onclick=(values)=>{
  if(values){
    skipToElement(values);
  }
}

4.Modal.confirm( )

antd中的Modal弹窗,进行交互的操作。

  Modal.confirm({
    title: '标题',
    icon: <Excalmation />,
    okText: '确定',
    cancelText: '取消',
    onOk: () => {},
    onCancel: () => {},
  });

5.includes()

includes() 方法用于判断数组是否包含某个指定的值,并返回一个布尔值。该方法是Array.prototype的实例方法,因此可以在任何数组对象上调用它。

const arr = [1, 2, 3, 4, 5];

console.log(arr.includes(2)); // 输出:true
console.log(arr.includes(6)); // 输出:false

includes() 方法可以接受两个参数:

  1. searchElement(必选):要搜索的元素。
  2. fromIndex(可选):从该索引处开始搜索 searchElement。默认值为 0,表示从数组的开始位置搜索。
const arr = [1, 2, 3, 4, 5];

console.log(arr.includes(2, 2)); // 输出:false
console.log(arr.includes(3, 3)); // 输出:true

includes() 方法是区分大小写的,也就是说,它使用的是全等比较(===)。如果你想进行不区分大小写的搜索,可以先将数组中的元素或要搜索的元素转换为相同的大小写形式,然后再使用 includes() 方法进行搜索。

const arr = ['apple', 'Banana', 'orange'];

console.log(arr.includes('banana')); // 输出:false
console.log(arr.includes('Banana'.toLowerCase())); // 输出:true

在这个例子中,arr.includes('banana') 的结果是 false,因为 'banana''Banana' 是区分大小写的。而 arr.includes('Banana'.toLowerCase())'Banana' 转换为小写,然后再进行搜索,因此结果是 true

6.filter( )

filter 方法创建了一个由通过测试的元素组成的新数组。

const numbers = [1, 2, 3, 4, 5, 6];

const evenNumbers = numbers.filter(number => number % 2 === 0);

console.log(evenNumbers); // 输出:[2, 4, 6]


const newData=data?.filter((e)=>lowData?.include(x))||[];

在这个例子中,filter 方法接收一个回调函数作为参数,该函数对数组中的每个元素执行,并返回一个布尔值。如果返回 true,则该元素会被包含在新数组中。

filter 方法不会改变原始数组,而是返回一个新的数组。这是与 map 方法的一个重要区别,map 方法会返回一个由回调函数结果组成的新数组,但不会去除不符合条件的元素。

filter 方法也可以接受第二个参数,即 thisValue,用于指定回调函数中的 this 绑定。如果提供了 thisValue,回调函数中的 this 将指向 thisValue

const numbers = [1, 2, 3, 4, 5, 6];

// 使用 thisValue 绑定 numbers 数组到回调函数中的 this
const evenNumbers = numbers.filter(function(number, index, arr) {
  // 在回调函数中使用 this.numbers 来引用原始数组
  return this.numbers[index] % 2 === 0;
}, { numbers: numbers });

console.log(evenNumbers); // 输出:[2, 4, 6]

在这个例子中,我们通过对象 { numbers: numbers } 作为 thisValue 传递给了 filter 方法。这样,回调函数中的 this 就指向了这个对象,而在回调函数内部,我们可以使用 this.numbers 来引用原始的 numbers 数组。

如果你不提供 thisValue,回调函数中的 this 将默认为 undefined。因此,在没有 thisValue 的情况下,我们不能直接引用原始数组或其他对象。

需要注意的是,thisValue 并不是 filter 方法的一个常用参数。通常,我们不需要在 filter 方法中改变 this 的绑定,因为 filter 方法本身就会返回一个新数组,而且我们通常会在回调函数中直接使用参数。然而,thisValue 在其他一些数组方法中,如 mapreduce,也是可以使用的。

7.toString( )

toString 是一个内置的方法,用于将对象转换为其字符串表示形式。对于大多数对象,toString 方法会被调用时,如果没有显式定义该方法,则会调用其原型链上的 toString 方法。

const obj = { name: 'John', age: 30 };

console.log(obj.toString()); // 输出:[object Object]

value?.toString()

在这个例子中,obj 是一个对象,它没有显式定义 toString 方法。因此,当尝试调用 obj.toString() 时,JavaScript 会查找 obj 的原型链上的 toString 方法。大多数内置对象都有这个方法,因此会输出 [object Object]

如果你想要自定义对象的 toString 方法,你可以像这样定义它:

const obj = {
  name: 'John',
  age: 30,
  toString: function() {
    return `Name: ${this.name}, Age: ${this.age}`;
  }
};

console.log(obj.toString()); // 输出:Name: John, Age: 30

在这个例子中,我们为 obj 定义了一个 toString 方法,它返回一个包含对象 nameage 属性的字符串。

toString 方法在需要将对象转换为字符串的地方非常有用,例如在控制台打印对象、将对象作为字符串传递给函数或与其他字符串操作时。

需要注意的是,toString 方法不应该被用来修改对象,它仅仅是为了对象的打印和表示。如果你想要克隆或序列化对象,应该使用其他方法,如 JSON.stringify

8.Object.fromEntries()

Object.fromEntries() 是一个静态方法,用于将一个键值对数组转换为一个对象。

const entries = [['name', 'John'], ['age', 30], ['city', 'New York']];

const obj = Object.fromEntries(entries);

console.log(obj); // 输出:{ name: 'John', age: 30, city: 'New York' }

在这个例子中,Object.fromEntries(entries) 接受一个键值对数组作为参数,并返回一个新对象,该对象的属性由数组中的键和值组成。

Object.fromEntries() 方法在处理来自不同来源的数据时非常有用,例如从 URL 查询字符串中提取键值对,或者从其他编程语言的 API 返回的数据结构中提取键值对。

这个方法也可以接受第二个可选参数,这是一个函数,用于对键值对进行处理或转换。

const entries = [['name', 'John'], ['age', 30], ['city', 'New York']];

const obj = Object.fromEntries(entries, (value, key) => [key, value.toUpperCase()]);

console.log(obj); // 输出:{ name: 'JOHN', age: '30', city: 'NEW YORK' }

在这个例子中,我们传递了一个函数作为第二个参数,该函数将键值对中的值转换为大写。这样,新对象中的属性值也将是大写的。

Tip:

Object?.entries( ) 是这个的反操作!React项目知识积累(一)博客中有解释icon-default.png?t=N7T8https://blog.csdn.net/weixin_45133582/article/details/139140450?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171677637916800185878591%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171677637916800185878591&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-139140450-null-null.nonecase&utm_term=Object.entries&spm=1018.2226.3001.4450

9.getItem()

getItem() 方法通常与 SessionStorageLocalStorage 对象相关联。这些对象允许你在网页会话期间或长期存储数据。

  • SessionStorage 用于存储在当前会话中持久化的数据,即使页面刷新或关闭也会丢失。
  • LocalStorage 用于存储长期的数据,除非明确删除,否则数据会一直存在。
// 对于 SessionStorage
sessionStorage.setItem('key', 'value');
const value = sessionStorage.getItem('key');
console.log(value); // 输出:value

// 对于 LocalStorage
localStorage.setItem('key', 'value');
const value = localStorage.getItem('key');
console.log(value); // 输出:value

在这个例子中,我们首先使用 setItem() 方法向 SessionStorageLocalStorage 存储了一些数据,然后使用 getItem() 方法检索了相同键的数据。

getItem() 方法的参数是一个字符串,表示你想要检索的数据的键。如果存储中存在该键,则 getItem() 方法将返回与该键关联的值;如果不存在,则返回 null

请注意,getItem() 方法检索的数据类型始终是字符串。如果原始数据类型不是字符串,存储时会自动转换为字符串,检索时也会返回字符串形式的数据。如果需要转换回原始数据类型,你可能需要在获取数据后进行手动转换。

10.Object.keys( )和Object.values( )

在JavaScript中,Object.keys()Object.values() 方法用于遍历对象(Object)的属性和值。

Object.keys()

Object.keys() 方法返回一个由指定对象自身的所有可枚举属性(包括其原型链上的可枚举属性)组成的数组。

const obj = {
  name: 'John',
  age: 30,
  isStudent: false
};

const keys = Object.keys(obj);
console.log(keys); // 输出:['name', 'age', 'isStudent']

Object.values()

Object.values() 方法返回一个由指定对象自身的所有可枚举属性值组成的数组。

const obj = {
  name: 'John',
  age: 30,
  isStudent: false
};

const values = Object.values(obj);
console.log(values); // 输出:['John', 30, false]

区别

  • Object.keys() 返回的是键名的数组。
  • Object.values() 返回的是键值的数组。

使用 forEach 遍历

你也可以使用 forEach 方法遍历这些数组。

const obj = {
  name: 'John',
  age: 30,
  isStudent: false
};

Object.keys(obj).forEach(key => {
  console.log(`${key}: ${obj[key]}`);
});

// 输出:
// name: John
// age: 30
// isStudent: false

或者,对于 Object.values()

const obj = {
  name: 'John',
  age: 30,
  isStudent: false
};

Object.values(obj).forEach(value => {
  console.log(value);
});

// 输出:
// John
// 30
// false

这些方法在处理对象时非常有用,特别是在需要获取对象的属性或值,然后进行进一步操作时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648877.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ai】pycharm安装langchain 相关module

pycharm module install 【Python学习 】一篇文章教你PyCharm如何快速安装module 【python】pycharm如何安装python的模块包版本 2024.1.2 RC2 找到当前的虚拟项目 找到解释器 我现在配置为专门为openai-start 准备的3.10 版本+ 号可以找到模块

linux经典定时任务

在使用时记得替换为自己的脚本路径。请在相应的脚本第一行加上#!/bin/bash&#xff0c;否则脚本在定时任务中无法执行。 1、在每天凌晨2点执行 0 2 * * * /bin/sh bashup.sh 2、每天执行两次 下面的示例命令将在每天上午5点和下午5点执行。您可以通过逗号分隔指定多个时间戳…

基于双差分值和RR间隔处理的心电信号R峰检测算法(MATLAB R2018A)

心电信号中的R峰是确定心率和节律、以及检测其它波形特征点&#xff08;图1A&#xff09;的基础。R峰的准确检测是心率变异性分析、心拍分割和心律失常识别重要的处理步骤。 现有的心电信号R峰检测方法主要为基于规则的决策法和基于深度学习的检测方法。基于规则的决策法通常对…

全域运营平台的优缺点各有哪些?听听使用者怎么说!

作为多个创业者交流群内的热点话题&#xff0c;关于全域运营平台优缺点的分析和点评不断涌现&#xff0c;为许多创业者更多信息的同时&#xff0c;也让他们的选择过程变得非常艰难。而在众多的全域运营平台中&#xff0c;被分析和点评次数最多的&#xff0c;当属全域运营平台。…

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…

勇于创新,勤于探索 —— 我的创作纪念日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

一文了解ai问答机器人:特点、应用、影响

很多人都听过ai问答机器人这个词&#xff0c;也许对于大部分人来说&#xff0c;对它的印象就是智能&#xff01;这是不可置疑的。你在生活中肯定也接触了不少的ai问答机器人。但是关于ai问答机器人&#xff0c;你是否了解它的特点、应用领域和对人类未来的影响呢&#xff1f;Lo…

【Python数据分析】基于自回归积分滑动平均模型的疫情分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 数据分析 数据来自法国疫情数据 资源地址&#xff1a;Python数据分析大作业 2000字 图文分析文档 疫情分析完整python代码 代码详解 完整代码文件 主要是对时间序列数据进行分析和预…

byzer plugin install log

离线插件参考地址&#xff1a; Byzer Documentation 离线安装方式&#xff08;错误过程记录&#xff09;&#xff1a; 参考文档&#xff1a;https://docs.byzer.org/#/byzer-lang/zh-cn/extension/README Byzer-lang 支持插件安装&#xff0c;删除&#xff0c;获取列表等。安装…

PHP8.3 使用openssl 的 DES-ECB 模式加密

因为开发环境要升级了&#xff0c;由原本的 7 升级到8.3&#xff0c;以前在7 的时候加密方式是这样的 openssl_encrypt($content, DES-ECB, $key) 在PHP8.2之后&#xff0c;已经开始不用 DES-ECB 模式&#xff0c;可以使用 phpseclib/phpseclib 平替&#xff0c;我使用的是2.…

Linux(三)

Linux&#xff08;三&#xff09; Linux网络配置管理网络基础知识 IP地址A类 由1个字节网络地址3个字节主机地址B类 由2个字节网络地址2个主机地址C类 由3个字节网络地址1个主机地址D类:主要用于组播E类:为将来使用保留 子网掩码子网掩码作用网关DNS服务器 Linux用户管理用户的…

Go 语言安装部署(超详细版本)

在学习和使用 Go 语言时&#xff0c;正确的安装和配置是非常重要的一步。本文将介绍如何在不同操作系统上安装 Go 语言&#xff0c;并讨论一些常见的配置选项&#xff0c;帮助读者更好地了解和使用 Go 语言。无论是初学者还是有一定经验的开发者&#xff0c;都能从本文中获得有…

RAC11G添加节点

添加节点场景 1、集群扩容 2、节点损坏后进行了删除操作&#xff0c;之后又要求恢复删除节点 环境和需求说明 由于3节点RAC&#xff0c;其中节点3因为本地盘损坏&#xff0c;导致系统完全损坏&#xff0c;系统需要重新安装。将损坏的3节点删除后再进行添加。 数据库版本&a…

力扣刷题--268. 丢失的数字【简单】

题目描述&#x1f357; 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数字&#xff0c;所以…

Compose Multiplatform 1.6.10 发布,解释一些小问题, Jake 大佬的 Hack

虽然一直比较关注跨平台开发&#xff0c;但其实我很少写 Compose Multiplatform 的内容&#xff0c;因为关于 Compose Multiplatform 的使用&#xff0c;其实我并没在实际生产环境上发布过&#xff0c;但是这个版本确实值得一提&#xff0c;因为该版本包含&#xff1a; iOS Bet…

蓝牙模块、WiFi模块等无线通信模块使用规范

在当今的科技时代&#xff0c;无线通信模块已经广泛应用于各类电子设备中。特别是蓝牙模块、WiFi模块等无线模块&#xff0c;它们为设备间的通信提供了便利&#xff0c;使得我们的生活更加便捷和高效。然而&#xff0c;为了确保这些无线模块正常工作并避免可能的安全隐患&#…

IDEA创建Spring Boot项目

1 打开新建项目界面 如图1&#xff0c;打开IDEA&#xff0c;点击菜单栏的File->New->Project&#xff0c;打开新建项目界面。 图1 新建项目 2 填写项目信息 在新建项目界面点击左侧工具栏的Spring Initializr选项&#xff0c;进行Spring Boot项目信息的填写&#xff…

kettle之 Concat fields将字符串拼接起来

用到两个组件&#xff0c;一个是文本文件输入&#xff0c;一个是 Concat fields 成功截图 文本文件输入 根据;将文本内容分成两部分&#xff0c;第一部分是a&#xff0c;第二部分是b Concat fields 运行即可 这里的Fields是上一个步骤里面的输出的字段名称 TargetField Nam…

# window10 设置一个【自定义运行】命令行快捷方式

window10 设置一个【自定义运行】命令行快捷方式 window10 [运行】命令行打不开&#xff0c;可采用如下简单快捷方法&#xff1a; 1、右键点击桌面空白处&#xff0c;然后点击【新建】&#xff0c;再点击【快捷方式】。 2、在【请键入对象的位置】文本框输入&#xff1a; exp…

【JavaEE进阶】——一万字带你深刻理解Spring IoCDI

目录 &#x1f6a9;Spring是什么 &#x1f388;什么是容器&#xff1f; &#x1f388;什么是 IoC&#xff1f; &#x1f4dd;传统开发思路 &#x1f4dd;IOC思想 &#x1f4dd;IoC 优势 &#x1f388;DI 介绍 &#x1f6a9;IoC 详解 &#x1f388;Bean的存储 &#x…