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

宿州房地产网站建设中国今日新闻

宿州房地产网站建设,中国今日新闻,苏州比较大的网站公司,网站做的最好的公司目录 useState useEffect useRef useContext useCallback useMemo useState const [初始值,修改值的方法] useState( 初始值 ) 我们用useState定义一个初始值,可以打印看一下结果 console.log(useState(10)) // [10, ƒ] 结果是一个数组&#xf…

目录

useState

useEffect

useRef

useContext

useCallback

useMemo


useState

const [初始值,修改值的方法] = useState( 初始值 )

我们用useState定义一个初始值,可以打印看一下结果

console.log(useState(10)) // [10, ƒ]

结果是一个数组,第0项就是我们定义的初始值,第1项则就是我们修改值的方法

我们用数组接收,就是结构出来我们需要的这两项

import React, { useState } from 'react'
import { Button } from 'antd'export default function Home() {console.log(useState(10))// 定义简单数据类型const [num, setNum] = useState(10)// 定义复杂数据类型const [obj, setObj] = useState({ age: 25 })// 如果初始化需要进行计算得出,我们也可以传入一个函数const [count, setCount] = useState(() => {let num = 100// ...return num})const addNum = () => {// 修改简单数据类型,可以这样直接修改setNum(num + 1)}const insertName = () => {// 修改复杂数据类型,1. 可以利用扩展运算符 2. 也可以深拷贝一份,再进行修改setObj({ ...obj, name: '张三' })}const changeCount = () => {setCount(999)}return (<div><h2 style={{ textAlign: 'center' }}>Home</h2><p>num的值: {num}</p><Button onClick={addNum}>num+1</Button><p>obj的值: {obj.age} - {obj.name}</p><Button onClick={insertName}>obj新增name属性</Button><p>count的值: {count}</p><Button onClick={changeCount}>修改count的值</Button></div>)
}

useState()还有一个特性,就是如果更新的数据与上次一样,React将跳过子组件的渲染及effect的执行

代码验证

父组件

import React, { useEffect, useState } from 'react'
import MusicSon from './MusicSon'
import { Button } from 'antd'export default function Music() {const [num, setNum] = useState(100)const numAdd = () => {// 我们看一下值没有改变的情况下,会不会触发effect和子组件setNum(100)}useEffect(() => {console.log('初始化effect执行了')}, [])return (<div><h2>Music</h2><Button onClick={numAdd}>num不变</Button><MusicSon toSon={num} /></div>)
}

子组件

import React from 'react'export default function MusicSon(props) {console.log('子组件触发执行啦')return (<div><h5>MusicSon</h5><p>从父组件接收过来的数据:{props.toSon}</p></div>)
}

发现只有一进来的时候触发了effect和子组件

 然后我们点击按钮,这时值没有发生改变,发现控制台什么都没有输出,说明只要更新的数据与上次一样,React将跳过子组件的渲染及effect的执行

useEffect

  • useEffect都是在组件dom渲染更新完毕之后才执行的

利用其副作用,执行一些操作,那什么是副作用呢?

上面是文档给出的副作用,看着挺懵逼的,其实说简单点,函数的副作用就是函数除了返回值外对外界环境造成的其它影响 。不理解也没事,其实我也不太理解(😜)

常见的副作用

  1. 数据请求 ajax发送
  2. 手动修改dom
  3. localstorage操作

下面说用法:

1.不添加依赖项

  • 组件首次渲染执行一次,以及不管是哪个状态更改引起组件更新时都会重新执行
    1. 组件初始渲染
    2. 组件更新 (不管是哪个状态引起的更新)
useEffect(()=>{console.log('副作用执行了')
})

2. 添加空数组

  • 组件只在首次渲染时执行一次
useEffect(()=>{console.log('副作用执行了')
},[])

3. 添加特定依赖项

  • 副作用函数在首次渲染时执行在依赖项发生变化时重新执行
    1. 组件初始渲染
    2. 依赖项发生变化时
function App() {  const [count, setCount] = useState(0)  const [name, setName] = useState('zs') useEffect(() => {    console.log('副作用执行了')  }, [count])  return (    <>      <button onClick={() => { setCount(count + 1) }}>{count}</button>      <button onClick={() => { setName('cp') }}>{name}</button>    </>  )
}

注意事项

  • useEffect 回调函数中用到的数据(比如,count)就是依赖数据,就应该出现在依赖项数组中,如果不添加依赖项就会有bug出现

清除副作用

  • 在组件被销毁时,如果有些副作用操作需要被清除(比如定时器)

语法:

useEffect(() => {​     // 副作用操作…​     return () => {​         // 写清除副作用的代码​     }})

eg: 清除定时器案例

父组件

import React from 'react'
import { useState } from 'react'
import Son from './pages/Son'export default function App() {const [flag, setFlag] = useState(true)return (<div><h2>App</h2><button onClick={() => setFlag(!flag)}>显示/隐藏组件</button>{flag && <Son></Son>}</div>)
}

子组件

import React, { useEffect } from 'react'export default function Son() {// 组件进来的时候触发一个定时器useEffect(() => {let timer = setInterval(() => {console.log('定时器执行了')}, 1000)// 组件销毁时清除定时器return () => {// 在return里面的函数里写清除操作clearInterval(timer)}}, [])return (<div><h3>Son</h3></div>)
}

useEffect 发送网络请求

  • 依赖项要是一个空数组,因为依赖项为空数组时只会在页面初始化时触发一次
import React from 'react'
import { useEffect } from 'react'export default function App() {const getData = () => {fetch('https://cnodejs.org/api/v1/topics').then((response) => response.json()).then((data) => console.log(data.data))}useEffect(() => {getData()}, [])return (<div><h2>App</h2></div>)
}

useRef

  • 获取元素的真实Dom

const 变量名 = useRef(null)

我们用useRef()定义一下,然后打印一下看看

console.log(useRef(null))

 可以看到,里面是有一个current属性,而这个属性里面存放的就是dom元素的内容,我们在useRef()中定义什么,current里就显示什么。需要获取那个元素的DOM,则直接让此元素的ref等于我们useRef()方法接收的变量即可

案例

在输入框中输入,我们点击按钮,获取到输入的内容

import React, { useRef } from 'react'
import { Button, Input } from 'antd'export default function Home() {const ipt = useRef(null)const getValue = () => {console.log(ipt)}return (<div><h2>Home</h2><Input placeholder="请输入内容" ref={ipt} /><Button onClick={getValue}>提交</Button></div>)
}

我们可以看到,current里面存放了一些属性和方法,其中的input里的value才是我们需要的 

import React, { useRef } from 'react'
import { Button, Input } from 'antd'export default function Home() {const ipt = useRef(null)const getValue = () => {console.log('输入的值为', ipt.current.input.value)}return (<div><h2>Home</h2><Input placeholder="请输入内容" ref={ipt} /><Button onClick={getValue}>提交</Button></div>)
}

useContext

一般深层组件传值用,类似于Vue的provide和inject

  • 传输的数据是响应式的,跨组件传输数据用
  • 如果想要传递的数据,只在整个应用初始化的时候传递一次就可以,则可以在index.js文件中提供数据(静态)
  • 如果传递的数据需要状态维护,则可以在app.js中提供数据(动态)

使用步骤

  1. 创建一个context的文件
  2. 使用createContext创建Context对象,并导出
  3. 在顶层组件引入,通过Provider提供数据
  4. 在底层组件引入,通过useContext函数获取数据

context.js

import { createContext } from 'react'const Context = createContext()export default Context

上层组件

import React, { useState } from 'react'
import Son from './pages/Son'
// 1. 引入Context
import Context from './utils/context.js'export default function App() {const [msg] = useState('根组件传递的数据')return (<>{/* 2. 使用Provider包裹上层组件提供数据 */}<Context.Provider value={msg}>{/* 根组件 */}<div><h2>App</h2><Son></Son></div></Context.Provider></>)
}

下层组件

import React, { useContext } from 'react'
import Context from '../utils/context.js'export default function Son() {let val = useContext(Context)return (<div><h3>Son</h3><p>从根组件得到的数据 --- {val}</p></div>)
}

useCallback

是一个带有记忆的函数,一般用作优化用

基本写法

const memoizedCallback = useCallback(() => {doSomething(a, b);},[a, b],
);

接收两个参数

  1. 第一个参数是处理函数
  2. 第二个参数是一个数组,用于指定被记忆的函数更新所依赖的值

只有第二个参数数组中的值发生改变了,第一个参数的处理函数才会执行

useCallback(fn, deps) 相当于 useMemo(() => fn, deps)

代码验证

  • 只有第二个参数中数组中的num变化时,才会触发useCallback中的第一个函数。如果第二个参数写一个空数组,则只会执行一次
import React, { useCallback, useState } from 'react'export default function Home() {const [num, setNum] = useState(10)const changeNum = useCallback(() => {setNum(num + 1)}, [num])return (<div><h2>{num}</h2><button onClick={changeNum}>改变num的值</button></div>)
}

为什么要使用useCallback() ?

函数式组件中,定义在组件内的函数会随着状态值的更新而重新渲染,因此函数中定义的函数会被频繁定义,在父子组件的通信中这样是非常消耗性能的。使用useCallback()结合memo就可以有效的减少子组件更新频率,提高效率和性能。

代码验证

父组件

import React, { useCallback, useState } from 'react'
import HomeSon from './HomeSon'export default function Home() {const [num, setNum] = useState(10)const [toSon, setToSon] = useState(999)const changeNum = useCallback(() => {setNum(num + 1)}, [num])const changeToSon = useCallback(() => {setToSon(toSon + 1)}, [toSon])return (<div><h2>{num}</h2><button onClick={changeNum}>改变num的值</button><HomeSon toSon={toSon} /><button onClick={changeToSon}>改变传给子组件的值</button></div>)
}

子组件

  • 用React.memo()包裹的组件,会监听props,只有props改变了,才会触发此组件的更新
import React from 'react'export default React.memo(function HomeSon(props) {const { toSon } = propsconsole.log('子组件触发了')return (<div><h3>HomeSon --- 从父组件接收过来的: {toSon}</h3></div>)
})

这样的话,只有1. 初始化的时候以及 2. 子组件接收的数据发生变化时,才会触发子组件的渲染

useMemo

基本写法(作用类似于Vue的计算属性,只要依赖项不发生改变,就不会重新计算)

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

接收两个参数

  1. 第一个参数是“创建”函数,用于处理耗时计算并返回需要记录的值
  2. 第二个参数是依赖项数组,用于指定第一个参数“创建”函数更新所依赖的值

仅会在某个依赖项改变时才重新计算。传入useMemo的函数会在渲染期间执行。但是不要在这个函数内部执行与渲染无关的操作,例如副作用,副作用这类的操作属于useEffect的使用范畴。

如果没有提供依赖项数组,useMemo在每次渲染时都会计算新的值

类似于Vue的计算属性,也会进行缓存。计算结果没有改变时,函数也不会触发

代码验证

需求:c的值为a+b,我们改变a或者b,c都能计算出最新的结果

import React, { useMemo, useState } from 'react'export default function Movie() {const [a, setA] = useState(0)const [b, setB] = useState(0)const aAdd = () => {setA(a + 1)}const bAdd = () => {setB(b + 1)}// 类似于Vue的计算属性const c = useMemo(() => {return a + b}, [a, b])return (<div><p>{a}</p><button onClick={aAdd}>a+</button><p>{b}</p><button onClick={bAdd}>b+</button><p>a + b = {c}</p></div>)
}

useMemo()的第一个函数还可以返回一段DOM

import React, { useMemo, useState } from 'react'export default function Movie() {const [a, setA] = useState(0)const [b, setB] = useState(0)const aAdd = () => {setA(a + 1)}const bAdd = () => {setB(b + 1)}// 类似于Vue的计算属性const c = useMemo(() => {return <h2>a + b 计算的结果是: {a + b}</h2>}, [a, b])return (<div><p>{a}</p><button onClick={aAdd}>a+</button><p>{b}</p><button onClick={bAdd}>b+</button><p>{c}</p></div>)
}

useMemo()与useCallBack()的区别?

  • useMemo传入的函数内部需要有返回值
  • useMemo只能声明在函数式组件内部(不像React.memo(),可以用在组件外部)


文章转载自:
http://folding.c7501.cn
http://crosslet.c7501.cn
http://cragsman.c7501.cn
http://desiderative.c7501.cn
http://sericin.c7501.cn
http://ours.c7501.cn
http://spirometer.c7501.cn
http://cosmotron.c7501.cn
http://weasel.c7501.cn
http://silky.c7501.cn
http://risque.c7501.cn
http://toxophilitic.c7501.cn
http://sardes.c7501.cn
http://kremlinologist.c7501.cn
http://amalgamation.c7501.cn
http://savannah.c7501.cn
http://cholelithiasis.c7501.cn
http://conclusion.c7501.cn
http://parol.c7501.cn
http://vitascope.c7501.cn
http://frisette.c7501.cn
http://trimetrogon.c7501.cn
http://contactee.c7501.cn
http://listing.c7501.cn
http://untired.c7501.cn
http://blindfold.c7501.cn
http://assistantship.c7501.cn
http://oxygenous.c7501.cn
http://siphonate.c7501.cn
http://handbell.c7501.cn
http://ragefully.c7501.cn
http://npd.c7501.cn
http://levelly.c7501.cn
http://mullen.c7501.cn
http://offaly.c7501.cn
http://legendarily.c7501.cn
http://dogcatcher.c7501.cn
http://electromusic.c7501.cn
http://calicoed.c7501.cn
http://gallisize.c7501.cn
http://heist.c7501.cn
http://cheddar.c7501.cn
http://somewhy.c7501.cn
http://brand.c7501.cn
http://pearlite.c7501.cn
http://wildcatter.c7501.cn
http://spotty.c7501.cn
http://amidohydrolase.c7501.cn
http://depolarize.c7501.cn
http://ascorbic.c7501.cn
http://floatability.c7501.cn
http://geobiology.c7501.cn
http://sporophyte.c7501.cn
http://esthetic.c7501.cn
http://normalise.c7501.cn
http://colourcast.c7501.cn
http://expend.c7501.cn
http://therapsid.c7501.cn
http://wuhu.c7501.cn
http://antonymy.c7501.cn
http://frantically.c7501.cn
http://traffickey.c7501.cn
http://hydronephrosis.c7501.cn
http://trigonal.c7501.cn
http://albumose.c7501.cn
http://popularise.c7501.cn
http://electrophoretic.c7501.cn
http://macular.c7501.cn
http://chez.c7501.cn
http://subdebutante.c7501.cn
http://tussis.c7501.cn
http://piliform.c7501.cn
http://psalmodist.c7501.cn
http://pimply.c7501.cn
http://selenous.c7501.cn
http://deaden.c7501.cn
http://zenocentric.c7501.cn
http://hadaway.c7501.cn
http://aspiring.c7501.cn
http://buryat.c7501.cn
http://incenter.c7501.cn
http://windflaw.c7501.cn
http://amelioration.c7501.cn
http://corybantic.c7501.cn
http://zionism.c7501.cn
http://articulation.c7501.cn
http://autolyzate.c7501.cn
http://gleaner.c7501.cn
http://paleoanthropology.c7501.cn
http://almshouse.c7501.cn
http://sulphuret.c7501.cn
http://selective.c7501.cn
http://studious.c7501.cn
http://belgrade.c7501.cn
http://determination.c7501.cn
http://graf.c7501.cn
http://kirghizia.c7501.cn
http://amongst.c7501.cn
http://cackle.c7501.cn
http://toughness.c7501.cn
http://www.zhongyajixie.com/news/99944.html

相关文章:

  • 有哪些公司网站建设比较好个人如何注册网址
  • 做电影网站被抓郑州外贸网站推广
  • 做黄色网站网站会被抓吗搜外seo视频 网络营销免费视频课程
  • 电子商务网站建设实训心得山东seo多少钱
  • 做网站常见程序百度搜索指数和资讯指数
  • 招聘网站开发模板广点通投放平台登录
  • 什么途径做网站最靠谱上海有什么seo公司
  • java做面试题的网站企业网站设计的基本内容包括哪些
  • 网站建设项目经理考题专门做推广的软文
  • 在IIs下建设一个网站温州seo按天扣费
  • 大型网站需要什么样的团队百度总部
  • 网页制作基础教程简介seo联盟
  • 简单的静态网页代码站长之家 seo查询
  • seo排名技术教程seo销售是做什么的
  • 设计电子商务网站青岛网站seo公司
  • 秦都区建设局网站想做app推广项目在哪找
  • wordpress百度链接提交厦门seo怎么做
  • 一个网站的建设需要什么时候开始济南百度代理
  • 中国品牌网官网入口手机优化大师
  • 吉林省住房和建设厅网站软文代写服务
  • 门户网站开发需求分析报告seo专员是什么意思
  • 企业网站开发设计发帖秒收录的网站
  • 弄美团网站的一般一个做赚多少钱百度上海分公司地址
  • 溧阳有做网站的吗关键词排名优化公司地址
  • 连云港网站关键词做电商如何起步
  • 网站制作手机版广告营销包括哪些方面
  • 合肥哪家公司做网站西安seo关键词推广
  • 做网站用什么系统好seo人才
  • iis 没有右键网站属性软文范例大全300字
  • 做公司网站一般多少钱外贸网站如何推广优化