React-Hooks常用示例

【React】React全家桶(十一)ahooks 阅读详情


React项目中经常用的hooks,有这几种!包括: 基本hooks & 优化hooks & 写组件常用hooks !我忘记的时候就来这里看一看!!

1、所有钩子函数,只能在组件顶层或自定义钩子函数顶层使用!🈲止出现在条件判断、循环、函数中。

2、自定义钩子函数格式为 useXXX

推荐:ahooks 3.0 钩子函数,引入到项目中使用

useEffect

定义生命周期

第一种:第二个参数「没有依赖数组」
1、 所在组件「初始化」时或「所有变量状态更新」时,执行包裹的函数。
2、「所有变量状态更新」前 或「页面卸载」前,执行返回值函数。

useEffect(()=>{
	
	//do something...

	return ()=>{
		// destroy something...
	}
}) 

第二种:第二个参数「依赖空数组」
1、所在组件「初始化」时,执行包裹的函数。
2、「页面卸载」前,执行返回值函数。

useEffect(()=>{
	
	//do something...

	return ()=>{
		// destroy something...
	}
},[]) 

第三种:第二个参数「依赖数组1个或多个状态变量」
1、所在组件「初始化」或「依赖数组变量状态更新」时,执行包裹的函数。
2、「依赖数组变量状态更新」前 或「页面卸载」前,执行返回值函数。

useEffect(()=>{
	
	//do something...

	return ()=>{
		// destroy something...
	}
},[count1,count2]) 

小小的useEffect 其实还有很多问题~

1、useEffect 函数中设置依赖项,如何避免更新依赖状态死循环?可以设置控制条件。如下:

conset [count,setCount] = useState(5);
useEffect(()=>{
	//设置控制条件
	if(count < 10){
		//do somethine...
	}
},[count]) 
# 好像有点问题~ 其实一个普通函数就可以满足。上述只是做示例!
const handleCount = ()=>setCount(count+1);

2、依赖项可以是对象吗?

可以,但不推荐!若对象层级较深,必然会引发更新性能问题,得不偿失!

1、useEffect依赖项可以是「对象类型」吗?

答:可以!

底层deps使用 Object.is() 做浅比较,更新时「即使是同一对象」也刷新!

方案1: JSON.stringify 格式化。需注意此方式风险!

方案2: 使用 ahooks库中 useDeepCompareEffect() 平替!deps用 react-fast-compare实现

方案3: 自定义支持深度依赖的hooks「https://www.jb51.net/article/277883.htm 」

⚠️依赖复杂结构的数据,易导致频繁渲染,慎用!!!

补充:JSON.stringify 格式化的问题。

  • 无法处理循环引用:如果被拷贝的对象中存在循环引用,即对象A中的某个属性引用了对象B,而对象B又引用了对象A,JSON.stringify会抛出异常。
  • 无法拷贝特殊对象:JSON.stringify无法正确地拷贝一些特殊对象,例如函数、正则表达式、Date对象等。这些特殊对象在转换过程中会被转换成其他类型的值,导致拷贝结果不准确。
  • 无法拷贝非枚举属性:JSON.stringify只能拷贝对象的可枚举属性,对于不可枚举属性和Symbol类型的属性,它会被忽略。
  • 对象属性丢失:在拷贝过程中,JSON.stringify会忽略undefined、函数以及symbol类型的属性,导致拷贝后的对象丢失这些属性。
  • 性能问题:JSON.stringify的性能相对较低,特别是在拷贝大型对象或嵌套层次较深的对象时,会消耗大量的时间和内存。

3、依赖项可以是父组件props吗?

不要这样做!依赖props的操作,可以用常量代替!如下:

const component = ({props1,props2})=>{
  //处理props参数
  const state1 = props1.toString().split(',');
  return (
    <div>
      {state1}
    </div>
  )
}

4、父子组件useEffect的执行顺序?

子组件useEffect先执行和先销毁,后父组件。

useState状态变量

conset [**state**,setState] = useState();

1、React是单向数据流的,改变state需要用到不改变原数据的方法,如下:

数组:js函数 map、filter、find、every、some、reduce、silce、join等等不改变原对象的方法。

对象: … 扩展

2、什么时候定义state?

参考 React哲学 观点! 抽离,共用state。

3、setState 改变state注意!

#是异步进行的,React中设计了批处理,同一操作,将多个setState合并执行!16版本用异步Promise和定时器包裹可实现同步,17、18版本中用flushAsync() 包裹实现同步执行!

一般不会那样操作,当有state和js操作需要同步执行时,首先请检查你的代码是否健康(可维护性、高内聚、低耦合)~

useRef 不引起刷新

用法1、获取实例对象或DOM对象

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

export default function App(props){
	const [count, setCount] = useState(0);

	const doubleCount = useMemo(() => {
		return 2 * count;
	}, [count]);

	const couterRef = useRef();

	useEffect(() => {
		document.title = `The value is ${count}`;
		// 打印 DOM 元素
		console.log(couterRef.current);
	}, [count]);

	return (
		<>
			<button ref={couterRef} 
				onClick={() => {setCount(count + 1)}}>Count: {count}, double: {doubleCount}
			</button>
		</>
	);
}

用法2 :使用useRef来期存储数据,对它修改也不会引起组件渲染。

在一个组件中有什么东西可以跨渲染周期,也就是在组件被多次渲染之后依旧不变的属性?

1、第一个想到的应该是state。没错,一个组件的state可以在多次渲染之后依旧不变。但是,state的问题在于一旦修改了它就会造成组件的重新渲染。

2、用Ref存储数据,改变值时,不会引起组件重新渲染。

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

//在下面的例子中
//我用ref对象的current属性来存储定时器的ID,这样便可以在多次渲染之后依旧保存定时器ID,从而能正常清除定时器。
export default function App(props){
	const [count, setCount] = useState(0);

	const doubleCount = useMemo(() => {
		return 2 * count;
	}, [count]);

	const timerID = useRef();

	useEffect(() => {
		timerID.current = setInterval(()=>{
			setCount(count => count + 1);
		}, 1000); 
	}, []);

	useEffect(()=>{
		if(count > 10){
			clearInterval(timerID.current);
		}
	});

	return (
		<>
			<button ref={couterRef} onClick={() => {setCount(count + 1)}}>
				Count: {count}, double: {doubleCount}
			</button>
		</>
	);
}

useLayOutEffect

这个钩子 会影响性能,尽可能的选择useEffect

useLayoutEffect 是 useEffect 的一个版本,它在浏览器重绘屏幕之前触发。

场景: 测量布局。

有时,这还不够。想象一下悬停时出现在某个元素旁边的工具提示。如果有足够的空间,工具提示应该出现在元素上方,但如果空间不够,它应该出现在元素下方。为了在正确的最终位置渲染工具提示,你需要知道它的高度(即它是否适合顶部)。

  1. 在任何地方渲染工具提示(即使位置错误)。英Render the tooltip anywhere (even with a wrong position).
  2. 测量它的高度并决定放置工具提示的位置。英Measure its height and decide where to place the tooltip.
  3. 在正确的位置再次渲染工具提示。英Render the tooltip again in the correct place.

所有这些都需要在浏览器重新绘制屏幕之前发生。你不希望用户看到工具提示在移动。在浏览器重绘屏幕之前调用 useLayoutEffect 执行布局测量:

可以的,写提示框组件的时候,用这个。

useMemo

1 组件内部的state发生改变的时候,便会重新渲染
2 父组件传递的props发生变化也会重新渲染

为了避免组件内部 没必要高额的计算开销,用useMemo优化变量数据

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

function UseMemo() {
	const [count, setCount] = useState(1);
	const [val, setValue] = useState('');

	// 未性能优化前,数据每次更新时,均会触发
	// const expensive = () => {
	//   console.log('compute');
	//   let sum = 0;
	//   for (let i = 0; i < count * 100; i++) {
	//       sum += i;
	//   }
	//   return sum;
	// }

	// 使用useMemo 性能优化,仅在count更新时触发 返回的是结果,避免了高额的计算,达到优化效果
	const expensive = useMemo(() => {
		console.log('compute');
		let sum = 0;
		for (let i = 0; i < count * 100; i++) {
			sum += i;
		}
		return sum;
	}, [count])

	return (
		<div>
			{/* <h4>{count}-{val}-{expensive()}</h4> */}
			<h4>{count}-{val}-{expensive}</h4>

			<p><button onClick={() => setCount(count + 1)}>+c1</button></p>

			<input value={val} onChange={event => setValue(event.target.value)}/>
		</div>

	)
}

export default UseMemo;

useCallBack

不是每个函数都需要使用它

useCallBack是一个缓存工具没错。但实际上他并不能阻止函数都重现构建。 返回的是一个函数

//Com组件
const Com =  () => {
	//示例1包裹了useCallBack的函数
	const fun1 = useCallBack(() => {
		console.log('示例一函数');
		...
	},[])

	//示例2没有包裹useCallBack的函数
	const fun2 = () => {
		console.log('示例二函数');
		...
	}
	return <div></div>

}

useCallBack的本质工作不是在依赖不变的情况下阻止函数创建,而是在依赖不变的情况下不返回新的函数地址而返回旧的函数地址。
注意:不论是否使用useCallBack都无法阻止组件render时函数的重新创建!!

useCallBack在什么情况下使用?

根据实际情况来用

在往子组件传入了一个函数并且子组件被React.memo缓存了的时候使用

React.memo()是通过校验props中的数据是否改变的来决定组件是否需要重新渲染的一种缓存技术,

具体点说React.memo()其实是通过校验Props中的数据的内存地址是否改变来决定组件是否重新渲染组件的一种技术。

只是浅比较。当传入函数时,优化失效

并不会阻止生成新的函数,只是返回旧的函数地址

import {useCallBack,memo} from 'react';
/**父组件**/
const Parent = () => {
const [parentState,setParentState] = useState(0);  //父组件的state
    
      
//需要传入子组件的函数 未用useCallBack优化
// const toChildFun = () => {
//    console.log("需要传入子组件的函数");
//     ...
//}
  
//需要传入子组件的函数  useCallBack优化
//使用useCallBack包一下需要传入子组件的那个函数。那样的话,父组件重新渲染,子组件中的函数就会因为被useCallBack保护而返回旧的函数地址,子组件就不会检测成地址变化,也就不会重选渲染。
//fn :一个函数最终会返回该回调函数,该回调函数仅仅只在 deps 参数发生改变时才会更新~
//deps :数组;用于触发 fn 回调函数改变的参数列表。 没有依赖项,就传一个空数组就行
 const toChildFun = useCallBack(() => {
        console.log("需要传入子组件的函数");
        ...
    },[deps])
    
    return (<div>
          <Button onClick={() => setParentState(val => val+1)}>
              点击我改变父组件中与Child组件无关的state
          </Button>

          //将父组件的函数传入子组件
          <Child fun={toChildFun}></Child>

    <div>)
}
 
/**被memo保护的子组件**/
const Child = memo(() => {
    consolo.log("我被打印了就说明子组件重新构建了")
    return <div><div>
})
 
复制代码
总结
  • useCallBack不要每个函数都包一下,否则就会变成反向优化,useCallBack本身就是需要一定性能的
  • useCallBack并不能阻止函数重新创建,它只能通过依赖决定返回新的函数还是旧的函数,从而在依赖不变的情况下保证函数地址不变
  • 注意: useCallBack需要配合React.memo使用

useImperativeHandle

新钩子,用于调用子组件内部的属性和方法,代替forword转发,非常方便。

具体例子如下:

import React, { useImperativeHandle, useRef } from "react";

const Imperative = () => {
  const mRef = useRef();
  const handleC = ()=>{
    mRef.current?.handlerConsole()
    console.log(111, mRef)
  }
  return (
    <div>
      测试useImperativeHandle
      <button onClick={handleC}>调用子组件方法</button>

        <br />
      <Child mRef={mRef}/>
    </div>

  );
};

const Child = props => {
    // 引用子组件方式 useImperativeHandle
    useImperativeHandle(props.mRef,
        () => {
            return {
                handlerConsole
            }
        }
    )
   
    const handlerConsole = ()=>{
        console.log('子组件相关操作');
    }
    return <div>
        这是子组件,需要调用方法
        <button onClick={handlerConsole}>get</button>

    </div>

};
export default Imperative;

useDeferredValue

作用: 让你推迟更新UI的一部分。

import { useState, useDeferredValue } from 'react';

function SearchPage() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  // ...
}

当 useDeferredValue 收到不同的值(与 Object.is 相比)时,除了当前渲染(当它仍然使用以前的值时)之外,它还会安排在后台使用新值重新渲染。

后台重新渲染是可中断的:

如果 value 有另一个更新,React 将从头开始重新启动后台重新渲染。例如,如果用户键入输入的速度快于接收延迟值的图表可以重新渲染的速度,则图表只会在用户停止输入后重新渲染。

非常nice,相当于防抖了~~~

useDeferredValue 与 集成 (意思是不用suppense)如果新值引起的后台更新暂停了 UI,**用户将看不到回退。**在数据加载之前,它们将看到旧的延迟值。如末尾的 — 代码1

由 useDeferredValue 引起的背景重新渲染**在提交到屏幕之前不会触发副作用。**如果后台重新渲染挂起,其副作用将在数据加载和 UI 更新后运行。

//无使用

//代码0

import { Suspense, useState } from 'react';
import SearchResults from './SearchResults.js';
//Suspense 显示loadding 更佳
export default function App() {
  const [query, setQuery] = useState('');
  return (
    <>
      <label>
        Search albums:
        <input value={query} onChange={e => setQuery(e.target.value)} />
      </label>

      <Suspense fallback={<h2>Loading...</h2>}>
        <SearchResults query={query} />
      </Suspense>

    </>
  );
}

//使用 代码1

在下例中输入 "a",等待结果加载,然后编辑输入为 "ab"。请注意,在加载新结果之前,你现在看到的不是 Suspense 回退,而是旧的结果列表:

import { Suspense, useState, useDeferredValue } from 'react';
import SearchResults from './SearchResults.js';

export default function App() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  return (
    <>
      <label>
        Search albums:
        <input value={query} onChange={e => setQuery(e.target.value)} />
      </label>

      <Suspense fallback={<h2>Loading...</h2>}>  //supsense为了做对比,而不是正在的渲染
        <SearchResults query={deferredQuery} />
      </Suspense>

    </>
  );
}

可以加一个视觉提示,表示,值在更新。

import { Suspense, useState, useDeferredValue } from 'react';
import SearchResults from './SearchResults.js';

export default function App() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  const isStale = ;
  return (
    <>
      <label>
        Search albums:
        <input value={query} onChange={e => setQuery(e.target.value)} />
      </label>

      <Suspense fallback={<h2>Loading...</h2>}>
      //加了视觉提示,表示值是更新了,只是没显示。非常nice~  
        <div style={{
          opacity: query !== deferredQuery ? 0.5 : 1,
        }}>
          <SearchResults query={deferredQuery} />
        </div>

      </Suspense>

    </>
  );
}

也可以优化组件渲染:

在此示例中,SlowList 组件中的每个项目都被人为减慢,以便你可以看到 useDeferredValue 如何让你保持输入响应。键入输入并注意在列表 “滞后” 时键入感觉很活泼。

注意:SlowList 需要加memo优化

import { useState, useDeferredValue } from 'react';
import SlowList from './SlowList.js';

export default function App() {
  const [text, setText] = useState('');
  const deferredText = useDeferredValue(text);
  return (
    <>
      <input value={text} onChange={e => setText(e.target.value)} />
      <SlowList text={deferredText} />
    </>
  );
}

React Hooks 全解: 常用 Hooks 及使用场景详解 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些 Hooks 涵盖了状态管理、副作用处理、性能优化、DOM 操作等各个方面,为开发者提供了强大的工具,大幅提高了开发效率和代码质量。让我们一起探索 React Hooks 的强大功能,提升您的 React 开发水平。 阅读详情

相关推荐

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6156

ahooks.js:一款强大的React Hooks库及其API使用教程(一)

ahooks是一款由阿里巴巴开发团队设计的React Hooks库,提供了一系列实用的React Hooks,以便开发者更好地使用React的功能。ahooks的设计原则是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同时保留最大的使用自由度。useRequest是ahooks中最常用的一个API,它用于处理异步请求和其相关状态。在上述代码中,useRequest接收一个函数作为参数,该函数返回一个Promise。

weixin_42662753的博客 9327

QDMA工程搭建/windows驱动编译与性能测试

请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。

qq_28455081的博客 2287

ahooks.js:一款强大的React Hooks库及其API使用教程(二)

ahooks是一款由阿里巴巴开发团队设计的React Hooks库,提供了一系列实用的React Hooks,以便开发者更好地使用React的功能。ahooks的设计原则是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同时保留最大的使用自由度。ahooks.js:一款强大的React Hooks库及其API使用教程(一)

weixin_42662753的博客 5937

DAC8568 Controller

DAC8568 ControllerDAC8568 简介串行接口三级目录 DAC8568 简介 PIN Description Name Description LDAC‾\overline{LDAC}LDAC load DACs SYNC‾\overline{SYNC}SYNC 低电平有效,电平触发控制, 该输入为输入数据的帧同步信号. 当SYNC为低,使能DAC内输入移位寄存器,并在随后的所有时钟沿采样数据。 在第32个时钟之后,DAC更新输出。 若不到32个时钟SYNC被置高(即

u010170039的博客 5131

用于可靠的钙钛矿薄膜瞬时光致发光模拟的拟合程序

简介 对光激发后的电荷载流子动态的研究对于确定太阳能电池的几个特性至关重要,例如,体和界面重组的数量以及向电荷传输层转移过程的速度。 瞬态光致发光(trPL)是用于研究这些特性的最流行的表征方法之一。 该实验是通过在样品上照射几纳秒的激光脉冲,并记录一段时间内的发光情况来进行的。辐射性重组的光生电荷载流子将引起太阳能电池的光子发射,而非辐射性重组的电荷载流子将不会对发光作出贡献。因此,可以测量到强度随时间递减的光致发光瞬态。(见图1表示trPL的测量和它的输出)。 图1. 一...

FluximAG的博客 2362

【项目实战篇】React强大且灵活hooks库——ahooks

在源码中它首先使用了一个getBoundingClientRect观察目标元素得到位置,判断它的top,bottom,left,right是否在可视区域内,用IntersectionObserver去监听当目标元素的位置发生变化时,目标元素是否还在可视区域内。ahooks 所有的输出函数,引用地址都是不会变化的( 通过useMemoizedFn(ahooks 封装的)实现的,其实现也是通过 useRef实现 )useRequest 的第一个参数是一个异步函数,在组件初次加载时,会自动触发该函数执行。

weixin_47002803的博客 1423

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1574

React Hooks 示例项目

下面创建一个使用Vite构建的React+TypeScript项目,并演示useStateuseEffectuseRef和hooks的使用。

The cure for boredom is curiosity. This is the log of its adventures. 684

Open-Sora代码详细解读(2):时空3D VAE

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2053

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 828

React Hooks 实战示例教程

React Hooks 实战示例教程 项目介绍 该项目【Lemoncode/react-hooks-by-example**】旨在通过一系列逐步指导的例子,向开发者展示如何在不同场景下应用React Hooks,从基础入门到高级话题。它对于希望深入学习React Hooks特性的开发者来说是一个宝贵的资源,提供了实际可运行的代码示例,帮助理解每个Hook的工作原理及最佳使用时机。 项目快速启动 ...

gitblog_00906的博客 678

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

常用的 React Hooks 的介绍和示例

常用的 React Hooks 的介绍和示例

林啾啾的博客 889

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

10个必学的React Hooks示例:React Typescript by sample实战教程

React Hooks彻底改变了函数组件的开发方式,让状态管理和生命周期控制变得更加简洁直观。本教程将通过`react-typescript-samples`项目中的实战示例,带你掌握10个最常用的React Hooks,从基础到进阶,轻松上手React+TypeScript开发。 ## 1. useState:基础状态管理 `useState`是最常用的Hooks,用于在函数组件中添加状态。在

gitblog_00786的博客 827

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Reactjs useState Hooks代码示例

是React Hooks的一种,用于在函数组件内部添加可变状态。下面是一个React中。

学亮编程手记 384

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

React Hooks 常用总结(用法、示例)

React Hooks 常用总结(用法、示例)

boy_hhx的博客 1746

reactjs hooks useEffect使用示例

name更新的时候就会调用: 传空数组整个APP渲染的时候只会执行一次: 总结一下:

学亮编程手记 382

React Hooks usestate源码示例

的实现会更复杂,因为它需要处理更多的边界条件,错误处理,以及性能优化。而且,在实际的 React 源码中,Fiber 的结构和工作方式也会更复杂。例如,React 使用了一个双缓冲技术,即每个 Fiber 有两个版本,一个当前在屏幕上的版本,和一个正在构建的新版本。实现通过保存每一次状态改变的 action 到一个 queue 中,然后在每次 render 的时候,遍历并执行这些 action 来更新 state。然而,React 源码的实现非常复杂,包含了很多边界条件的处理,错误处理,以及性能优化。

weixin_44738632的博客 890

从React Tutorial到现代React:如何将经典示例升级到Hooks和函数组件

React Tutorial是Facebook官方提供的经典React学习示例,展示了如何使用React构建一个简单的评论应用。然而,这个示例使用的是ES5语法和React.createClass,与现代React开发实践已有较大差距。本文将为你展示如何将这个经典示例升级到现代React,使用Hooks和函数组件,让你的代码更简洁、更易维护。😊 ## 为什么需要升级到现代React? Rea

gitblog_00280的博客 915

React的7个常用Hooks及使用场景(含示例)

用于在函数组件中添加状态。使用 useState 可以在函数组件中添加状态,从而实现状态管理的功能。

大道至简 2478

React 常用 Hooks 的具体代码示例,包含使用场景和实际实现

特点:自定义子组件通过ref暴露给父组件的方法,控制暴露的接口。适用场景:封装组件时限制外部访问范围// 子组件 - 使用forwardRef接收ref// 自定义暴露给父组件的方法// 只暴露需要的方法},// 不暴露内部的textareaRef}));});// 父组件使用return (<div>聚焦编辑器</button>console.log('内容:', editorRef.current.getValue());}}>获取内容</button>

weixin_43934792的博客 363

React 中与生命周期相关的 Hooks 及其使用示例

useMemo 接受两个参数:第一个参数是一个函数,用来计算结果,第二个参数是一个数组,用来指定哪些状态变量发生变化时需要重新计算结果。useEffect 接受两个参数:第一个参数是一个回调函数,第二个参数是一个数组,用来指定哪些状态变量发生变化时需要重新执行回调函数。在这个示例中,useMemo 函数用于缓存 count 和 factor 的乘积,避免在每次渲染时都重新计算。在这个示例中,useLayoutEffect 函数在组件挂载后立即调用,用于监听窗口大小变化,并在窗口大小变化时更新状态。

笔记、经验、日常分享 1703

ReactJS 基础系列项目推荐

ReactJS 基础系列项目推荐 1. 项目的基础介绍和主要的编程语言 ReactJS 基础系列 是一个开源项目,旨在通过一系列的教程帮助开发者掌握 ReactJS 的基础知识。该项目由 Maximilian Schwarzmüller 创建,源代码托管在 GitHub 上。项目的主要编程语言是 JavaScript,同时也包含少量的 HTML 代码。 2. 项目的核心功能 该项目的核心功能是通过...

gitblog_00342的博客 297

【React Hooks】掌握及对比常用的8个Hooks(优化及使用场景)

前言     有一段时间没写文章了,总结记录一下个人常用的或个人认为该掌握的九个React Hooks。我来网易之前是刚学的React框架,当时看了一天公司项目,然后发现得去看一下React Hooks,看了一个周末,做了点总结,在此分享一下。本文对每一个Hooks都结合了示例及使用场景进行讲解,稍微有点长,你可以针对你想要学习的Hooks有目的性得去看。 React Hooks 1 useState 1.1 类组件中 在类组件中,可以用this.state来定义类组

qq_40597589的博客 2652

React Hooks 钩子函数的使用

v16.8 版本引入 设计目的:加强版函数组件,完全不使用"类",就能写出一个全功能的组件 钩子使用use前缀命名,要使用 xxx 功能,钩子就命名为 usexxx。 React默认提供的4种钩子 useState() // 状态钩子 useContext() // 共享状态钩子 useReducer() // action 钩子 useEffect() // 副作用钩子 eg. useState的使用 import React, { useState } from 'react';.

shiningchen322的博客 863
上一篇: TypeScript 简明使用指南
下一篇: 前端工具函数
知夏__
博客等级 码龄5年 94粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值