react—Hook(2)

这篇具有很好参考价值的文章主要介绍了react—Hook(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

6. useMemo—似计算属性

useMemo和useCallback的作用十分类似,只不过它允许记住任何类型的变量(useCallback只记住函数)。当改变其他变量时,普通函数都会运行,它返回的结果并没有改变。这个时候就可以使用useMemo将函数的返回值缓存起来。用来优化代码。 

import React, { useState } from "react";

export default function App() {
  let [msg, setMsg] = useState("hello");
  let [n, setN] = useState(2);
  // 求变量(数字)是否为素数
  let fn = (n) => {
    console.log("计算素数", n);
    n = parseInt(n);
    if (n <= 3) {
      return n > 1;
    }
    for (let i = 2; i < n; i++) {
      if (n % i === 0) {
        return false;
      }
    }
    return true;
  };
  return (
    <div>
      <h2>App</h2>
      {<p>{n}是---{fn(n) ? "素数" : "非素数"}</p>}
      <button onClick={() => setN(13327)}>changeN</button>
      <p>{msg}</p>
      <button onClick={() => setMsg("world")}>changeMsg</button>
    </div>
  );
}

react—Hook(2),react.js,javascript,前端

解决办法:useMemo来记录函数

// 添加
  let sushu = useMemo(() => {
    let fn = (n) => {
      console.log("计算素数", n);
      n = parseInt(n);
      if (n <= 3) {
        return n > 1;
      }
      for (let i = 2; i < n; i++) {
        if (n % i === 0) {
          return false;
        }
      }
      return true;
    };
    return fn(n);
  }, [n]);
}
// 使用
<p>{n}---{sushu ? "素数" : "非素数"}</p>

react—Hook(2),react.js,javascript,前端

 补充点:react中,为什么组件return出来的虚拟模板对象要加小括号

答:在js语法中函数内部的return的用法

        不写 默认函数调用完毕 生成undefined

        写数据直接量

        写表达式,表达式执行结果作为函数的返回值

        return后面不写 <==> 生成undefined

        return语法注意点:必须写在return后面,不能换行(因为js语法中换行代表语句结束)

所以,如果不加小括号,且换行了,js语法就默认换行为语句结束,返回undefined,而不是返回整个模板。

7. 受控组件—似双向数据绑定

非受控组价:输入框内容为只读,不能手动修改,只能用代码改。

import React, { useState } from "react";

export default function Box() {
  let [email, setEmail] = useState("222");
  let login = () => {
      console.log(email);
      setEmail("6666");
  };
  return (
    <div>
      <h3>Box</h3>
      <input type="text" value={email} />
      <button onClick={login}>get</button>
    </div>
  );
}

react—Hook(2),react.js,javascript,前端

受控组件:类似双向数据绑定。onChange事件 + event.target.value

import React, { useState } from "react";

export default function Box() {
  let [email, setEmail] = useState("222");
  let login = () => {
    console.log(email);
  };
  return (
    <div>
      <h3>Box</h3>
      <input type="text" value={email} onChange={()=>setEmail(event.target.value)} />
      <button onClick={login}>get</button>
    </div>
  );
}

react—Hook(2),react.js,javascript,前端

 8. useContext—多层状态传递

1. 定义

允许在父级组件和底下任意层次的子组件之间传递状态。在函数组件中使用useContext来使用。Context。

2. 方法

创建上下文时,需要将这个ctx单独放在一个js文件中,要使用上下文的就导入进去。使用React.createContext来创建。

import React from "react";
let ctx = React.createContext({})
export default ctx;

父组件提供: <ctx.Provider value={{ 提供的对象 }}></ctx.Provider>

后代组件使用:let obj = useContext(ctx); <h3>Box--{obj.age}</h3>

// App父组件
import React, { useState } from 'react'
import ctx from './ctx.js';
import Box1 from "./Box1.jsx";
import Box2 from "./Box2.jsx";
export default function App() {
  let [msg, setMsg] = useState('hello');
  // ctx.Provider是一个组件
  return (
    <ctx.Provider value={[msg, setMsg]}>
      <div>
        <h2>App--{msg}</h2>
        <Box1></Box1>
        <Box2></Box2>
      </div>
    </ctx.Provider>
  );
}
// Box1子组件
import React, { useContext } from 'react'
import ctx from "./ctx.js";
import Box11 from "./Box11.jsx";

export default function Box1() {
    let [msg, setMsg] = useContext(ctx);
    let chengeMsg = () => {
        setMsg('world')
    };
  return (
    <div>
      <h3>Box1---{msg}</h3>
      <Box11></Box11>
      <button onClick={chengeMsg}>chengeMsg</button>
    </div>
  );
}

// Box11 孙组件
import React, { useContext } from 'react'
import ctx from "./ctx.js";

export default function Box11() {
    let [msg, setMsg] = useContext(ctx);
  return (
      <div>Box11--{msg}</div>
  )
}

// Box2组件 和Box1同级
import React, { useContext } from "react";
import ctx from "./ctx.js";

export default function Box2() {
  let [msg, setMsg] = useContext(ctx);
  return (
    <div>
      <h3>Box2---{msg}</h3>
    </div>
  );
}

上面案例可以实现子组件Box修改父组件App传来的值,并属性页面中所有用到msg的组件。

react—Hook(2),react.js,javascript,前端

3. 提供多个上下文时

父组件提供多个数据时,可以使用嵌套来实现(只需要把上下文创建并引入即可),也可以把多个上下文放在同一个上下文中,需要使用哪个状态就通过点语法来取。比如:

// App父组件
import React, { useState } from 'react'
import ctx from './ctx.js'
import ctx2 from "./ctx2.js";
import ctx3 from "./ctx3.js";
import Box1 from "./Box1.jsx"
import Box2 from "./Box2.jsx"
import Box3 from "./Box3.jsx"
export default function App() {
  // let [state, setSate] = useState({cardata:{ title: "电脑", id: 21 },userdata:{ name:"rosy"}})
    let [age, setAge] = useState(33);
    let [msg, setMsg] = useState({ name: "jack" });
  return (
    <ctx2.Provider value={[msg, setMsg]}>
      <ctx.Provider value={[age, setAge]}>
        <div>
          <h2>App--{age}</h2>
          <Box1></Box1>
          <Box2></Box2>
        </div>
      </ctx.Provider>
    </ctx2.Provider>
  );
}
// Box1
import React from 'react'
import Box11 from "./Box11.jsx"
export default function Box1() {
  return (
    <div>
        <h2>Box1</h2>
        <Box11></Box11>
    </div>
  )
}
// Box11 孙组件
import React,{useContext} from 'react'
import ctx2 from './ctx2.js'
export default function Box11() {
      let [msg, setMsg] = useContext(ctx2);
  return (
    <div>Box11--{msg.name}</div>
  )
}

// Box2子组件
import React, { useContext } from "react";
import ctx from "./ctx.js";

export default function Box2() {
  let [age, setAge] = useContext(ctx);
  return (
    <div>
      <h3> Box2--{age}</h3>
    </div>
  );
}

当一个函数组件使用了useContex时,它就订阅了这个ctx的变化,这样当ctx.Provider的value发生变化的时,这个组件就会被重新渲染。上面有介绍,当有多个上下文时可以使用同一个ctx里面,而不同的子组件可能只关心该ctx的某一部分状态,当ctx里面的任意值发生变化的时候,无论这些组件用不用到这些数据它们都会被重新渲染,这样会造成无用渲染,影响性能。接下来介绍三种解决无用渲染的方法

9. React.memo

1. 拆上下文

2. useMemo

不需要用到上下文的函数用useMemo来缓存,写上依赖项。文章来源地址https://www.toymoban.com/news/detail-526494.html

import React, { useContext, useMemo, useState } from "react";
import ctx from "./ctx";

export default function Box3() {
    let [state, setSate] = useContext(ctx)
    let [n, setn] = useState(100)
    
    return useMemo(() => {
        console.log("刷新模板--只有数据变化才会刷新")
        return (
            <div>
                <h2>Box3</h2>
                <p>{state.userdata.name}</p>
            </div>
        )
    }, [state.userdata.name]);
}

3. React.memo

import React, { useContext, useMemo, useState } from "react";
import ctx from "./ctx";

let Box = React.memo(({ userinfo }) => {
  console.log("刷新模板--无用渲染");
  return (
    <div>
      <h2>box3</h2>
      <p>{userinfo}</p>
    </div>
  );
});
export default function Box3() {
  let [state, setSate] = useContext(ctx);

  return <Box userinfo={state.userdata.name}></Box>;
}

到了这里,关于react—Hook(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【实战】三、TS 应用:JS神助攻 - 强类型 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(三)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月11日
    浏览(55)
  • 【实战】 五、CSS 其实很简单 - 用 CSS-in-JS 添加样式(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(七)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月12日
    浏览(40)
  • 【实战】 五、CSS 其实很简单 - 用 CSS-in-JS 添加样式(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(六)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月12日
    浏览(47)
  • JavaScript 框架比较:Angular、React、Vue.js

    在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。这些首字母相同的选项各自代表不同的技术加工具组合。为了在这些技术栈中做出明智选择,让我们先从核心组件聊起,再对各自前端框架(React、Angular 和 Vue)进行简化比

    2024年01月20日
    浏览(59)
  • 从javascript到vue再到react:前端开发框架的演变

    目录 JavaScript: 动态语言的基础 JavaScript:Web开发的起点 Vue.js: 渐进式框架的兴起 Vue.js:简洁、高效的前端框架 React.js: 声明式UI的革新 React.js:强大、灵活的前端框架 演变之路与未来展望 演变过程 当提到前端开发中的框架时,JavaScript、Vue.js和React.js是三个最常见的名词。它

    2024年02月07日
    浏览(53)
  • JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较

    在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈包含四大具体组件: MongoDB:一款强大的 NoSQL 数据库,以灵活的 JSON 格式存储数据。 Express.js:一套极简但强大的

    2024年02月03日
    浏览(58)
  • 2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

    🎉欢迎来到Java学习路线专栏~探索2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java学习路线 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 🍹文章作者技术和水

    2024年02月11日
    浏览(49)
  • jQuery.js - 前端必备的Javascript库

    作者: WangMin 格言: 努力做好自己喜欢的每一件事 jQuery.js 是什么? jQuery是一个快速简洁、免费开源易用的JavaScript框架, 倡导写更少的代码,做更多的事情 。它封装JavaScript常用的功能代码,提供了一种简便的JavaScript设计模式,以及我们开发中常用到的操作DOM的API,优化HTML文

    2024年02月05日
    浏览(77)
  • Node.js npm V8 React Express的运行配合关系:构建JavaScript应用的基石

    目录 Node.js 和 V8 引擎 Node.js 和 npm LTS(Long Term Support) React Node.js的作用 Express Node.js 和 V8 引擎 Node.js 使用 Google 的 V8 JavaScript 引擎 来执行 JavaScript 代码。V8 是一个高性能的 JavaScript 和 WebAssembly 引擎,用于在 Google Chrome 浏览器和 Node.js 中运行 JavaScript。 V8 引擎的更新 通常包括

    2024年03月12日
    浏览(64)
  • 前端框架之争:Vue.js vs. React.js vs. Angular

    🎉欢迎来到Web前端专栏~前端框架之争:Vue.js vs. React.js vs. Angular ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果

    2024年02月07日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包