当前位置: 首页 > news >正文

江苏苏州有什么好玩的东莞网站关键词优化排名

江苏苏州有什么好玩的,东莞网站关键词优化排名,免费素材网站pexels,成都交投成高建设公司网站React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback) 一、useContext的使用 在类组件开发时,我们通过 类名.contextType MyContext的方式,在类中获取context,多个Context或者在函数式组件中…

React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback)

一、useContext的使用

在类组件开发时,我们通过 类名.contextType = MyContext的方式,在类中获取context,多个Context或者在函数式组件中通过MyContext.Consumer方式共享context:

import React, { memo } from 'react'
import { UserContext, ThemeContext } from './context'export default memo(function App() {// 使用Contextreturn (<div><UserContext.Consumer>{value => {return (<h2><ThemeContext.Consumer>{value => {<span></span>}}</ThemeContext.Consumer></h2>)}}</UserContext.Consumer></div>)
})

可以看到,当我们需要使用多个Context时,存在大量繁琐的嵌套代码;而Context Hook能够让我们通过Hook直接获取某个Context的值,如下:

import React, { memo, useContext } from "react";
import { ThemeContext, UserContext } from "./context";export default memo(function App() {// 使用Contextconst user = useContext(UserContext);const theme = useContext(ThemeContext);return (<div><h2>User: {user.name} - {user.age}</h2><h2>Theme: {theme.color} - {theme.size}</h2></div>);
});

可以看到,Context Hook仅用了两行代码就替代了上面繁杂的嵌套代码,十分高效简洁。

二、useReducer的使用

useReducer是useState的一种替代方案,当state的处理逻辑比较复杂,可以使用useReducer来进行拆分,或者当修改state时需要依赖之前的state时,也可以使用useReducer。

useReducer使用的场景非常少,通常用于需要统一管理、修改多个数据的场景。例如,当我们需要对多个数据进行统一处理时,若采用useState,则需要多次定义,而reducer可以对其进行统一定义、修改:

import React, { memo, useReducer, useState } from "react";function reducer(state, action) {switch (action.type) {case "increment":return { ...state, counter: state.counter + 1 };case "decrement":return { ...state, counter: state.counter - 1 };case "add_number":return { ...state, counter: state.counter + action.num };case "sub_number":return { ...state, counter: state.counter - action.num };default:return state;}
}export default memo(function App() {// const [count, setCount] = useState(0);// const [user, setUser] = useState(0);// const [list, setList] = useState(0);const [state, dispatch] = useReducer(reducer, {counter: 0,user: {},list: [],});return (<div>{/* <h2>当前计数:{count}</h2><button onClick={(e) => setCount(count + 1)}>+1</button><button onClick={(e) => setCount(count - 1)}>-1</button><button onClick={(e) => setCount(count + 5)}>+5</button><button onClick={(e) => setCount(count - 5)}>-5</button><button onClick={(e) => setCount(count + 100)}>+100</button> */}<h2>当前计数:{state.counter}</h2><button onClick={(e) => dispatch({ type: "increment" })}>+1</button><button onClick={(e) => dispatch({ type: "decrement" })}>-1</button><button onClick={(e) => dispatch({ type: "add_number", num: 5 })}>+5</button><button onClick={(e) => dispatch({ type: "sub_number", num: 5 })}>-5</button><button onClick={(e) => dispatch({ type: "add_number", num: 100 })}>+100</button></div>);
});

三、useCallback的使用

useCallback实际的目的是为了进行性能优化,useCallback会返回一个函数的memoized(记忆的)值。在依赖不变的情况下,多次定义的时候,返回的值时相同的。

useCallback的性能优化:

  1. 当需要将一个函数传递给子组件时,可使用useCallback进行优化,将优化之后的函数,传递给子组件

    import React, { memo, useCallback, useState } from "react";const HYIncrement = memo(function (props) {const { increment } = props;console.log("HYIncrement被渲染");return (<div><button onClick={increment}>increment + 1</button></div>);
    });export default memo(function App() {const [count, setCount] = useState(0);const [message, setMessage] = useState("hello");// 使用useCallbackconst increment = useCallback(function () {setCount(count + 1);},[count]);// 普通函数// const increment = () => {//   setCount(count + 1);// };return (<div><h2>计数:{count}</h2><button onClick={increment}>+1</button><HYIncrement increment={increment} /><h2>message:{message}</h2><button onClick={(e) => setMessage("world")}>修改 message</button></div>);
    });
  2. 进一步优化

    当count发生改变时,也使用同一个函数

      // 做法一:将count依赖移除掉,缺点:存在闭包陷阱,不依赖count后setCount每次拿到的count并非最新的count// const increment = useCallback(function foo() {//   console.log("increment");//   setCount(count + 1);// }, []);// 做法二:利用useRef,在组件多次渲染时,返回同一个值const countRef = useRef();countRef.current = count;const increment = useCallback(function foo() {console.log("increment");setCount(countRef.current + 1);},[]);
    
http://www.hengruixuexiao.com/news/19932.html

相关文章:

  • 哪个公司做网站比较好2020最新推广方式
  • 网站架构设计师电商运营主要工作内容
  • 从网上下载的网站源码怎么用seo赚钱方法大揭秘
  • 学校的二级网站怎么建设不受国内限制的搜索引擎
  • 网站开发实用技术相关论文seo管理系统培训
  • 做网站的收钱不管了百度搜索指数排行榜
  • 哈尔滨网站建设网站开发网站服务器查询工具
  • 农产品网站开发技术方案与设施网络营销现状分析
  • 智能建站系统下载网站维护合同
  • wordpress文章没缩略图seo公司官网
  • 做兼职的网站都有哪些工作做百度推广的网络公司广州
  • 网站建设哪家公司如何去推广
  • 郑州中原网站建设郑州seo网站排名
  • 怎么做动态网站php品牌策划方案模板
  • 做愛偷拍视频网站服务营销论文
  • 网站缺陷和优化的例子热点军事新闻
  • wordpress网站怎么加速站长工具ip地址查询域名
  • 响应式网站的登录设置聚名网域名注册
  • 大气科技类企业公司网站源码免费企业网站建设
  • 网站收录方法关键词优化如何
  • 佛山专业的网站建设网站流量统计分析工具
  • 2018做网站用什么开发哈尔滨seo关键字优化
  • wordpress dreamweaver海口百度seo公司
  • 做推广的网站带宽需要多少合适百度推广方案怎么写
  • 域名注册好了怎么样做网站百度免费
  • 昆明网站建设教学视频百度自然排名优化
  • 网站安全证书有问题如何解决高清的网站制作
  • 怎样用b2b网站开发客户百度指数的搜索指数
  • 财经门户网站建设推广自己产品的文案
  • 彩票网站如何做推广百度推广客户端怎样注册