React hooks API小结

自定义 Hooks 封装 API 调用:简化异步逻辑 在现代的前端开发中,React 已经成为了构建用户界面的主流框架。在 React 应用里,经常需要和后端 API 进行交互,处理各种异步操作。然而,异步逻辑往往会让代码变得复杂和难以维护。本文的目的就是教大家如何利用 React 的自定义 Hooks 来封装 API 调用,让异步逻辑变得更加简单、清晰和易于管理。我们会从基本概念入手,逐步深入到实际的代码实现和应用场景。首先,我们会介绍自定义 Hooks 和 API 调用的核心概念,用简单易懂的例子帮助大家理解。 阅读详情

文章中的例子戳这里看github

hooks 的规则

  • 只能在最高层级调用hooks,不能在循环, 条件或者嵌套方法中调用。
  • 只能在函数组件中调用Hooks, 不能在普通的函数方法中调用(自定义Hook除外)。

hooks是要能够重用stateful logic,即控制state的逻辑,而不是state本身。实际上,任何对hook的调用都会有完全独立的state,所以你甚至可以在一个组件中重用相同的组件Hook

setState

建议根据哪些值是一起变化的,将state拆分成多个小的state。而不是一上来就设一个大的复杂state。

const [state, setState] = useState(initialState)

setState(currentState)
setState((prevState) => f(prevState))
  • 接受一个值或者一个函数
  • 是整个替换更新,而不是
    自动Merge,需要解构自己merge(或者使用useReducer)
  • 懒init 如果initialState需要通过复杂计算获得,可以提供一个函数
const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props)
  return initialState
})
  • 如果update的值跟之前的值相同,React可能会渲染组件本身,但不会渲染子组件和相关的effects。用Object.is来比较二者。
  • 如果在渲染时有昂贵的计算,则用useMemo来优化

useEffect

在函数式组件/render阶段中不允许有状态的改变,订阅,定时器,日志和其他引起副作用的方法。但可以使用useEffect来做这些事情。它与React类中的componentDidMount,componentDidUpdate和componentWillUnmount具有相同的用途,但整合到了单个的API中。

effect可以分为需要清理的和不需要清理的。网络请求,手动修改dom,和打印日志都属于常用的无需清理的effect。

  • 为何useEffect要在组件内部调用?
    函数作用域问题。这样可以直接在effect中获取到state变量,而不需要一个额外的api去获取。这是js的闭包特性决定的。
  • useEffect是不是在每次渲染之后都会运行?是的!默认是在第一次渲染和以后的每次更新都会跑,当然,可以通过传第二个参数来自定义它。与其用mounting, updating这样的术语来描述它,倒不如想成是effects会在每次render之后发生。React保证DOM在运行effects之前已经被更新了。

useEffect(asyncFn, state)
asyncFn会在render已经完成后执行。在纯函数的世界里,这是一个通往命令世界的逃生舱。
asyncFn需要返回一个清理side-effect的函数。该函数会在组件从UI中移除之前运行,以避免内存泄露。
async并不是指传入的第一个参数本身是async的,而是说里面可以声明一个async的函数,再执行它。

useEffect(() => {
  const subscription = props.source.subscribe()
  return () => {
    subscription.unsubscirbe()
  }
})

effects的时机

为了避免在每次更新的时候都会清理上次、重新订阅,可以注意下effects的时机。不像componentDidMount和componentDidUpdate, 传给useEffect的函数在布局和绘制(layout and paint)之后被触发,处于一个被延迟的事件中。这样对许多订阅和事件监听都是适用的,但并非所有的effects都可以被稍后执行。例如,一个展现给用户看的DOM更新必须在下一次绘制的时候同步执行,对这类的effects, react提供了一个特别的hook,叫做useLayoutEffect。它有着与useEffect相同的函数签名,只是触发的时机不同。

尽管useEffect会在浏览器绘制之后延迟触发,但是它一定会在下一次的render之前触发。

条件触发一次effect

useEffect的函数接受第二个参数,一个数组,只有里面的值变动了,才会重新重新触发Effect函数。
确保数组中包括了组件的所有会随着时间改变,并被effect使用的props, state值

  • 如果只想触发一次和清理一次(mount and unmont),可以传一个空数组

useContext

const value = useContext(MyContext)

接受一个context对象(从React.createContext)中创建,并返回一个代表当前的context的值,这个值由最近的<MyContext.Provider>的value Prop决定。当该Provider更新的时候,这个hook就会触发一次重新渲染,会根据最近的一次传给MyContext的value属性变化。

useContext(MyContext) 基本与在class中static contextType = MyContext类似,或者类似于<MyContext.Consumer>

useReducer

const [state, dispatch] = useReducer(reducer, initialArg, init)

因为可以把dispatch方法传下去代替回调,对触发深层结构更新的组件会有效率上的优化

const initialState = {count, 0}

function reducer(state, action) {
  switch (action.type) {
    case 'increment': return {count: state.count +1}
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
    }
}

function Counter({initialState}) {
  const [state, dispatch] = useReducer(reducer, initialState)
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
    </>
  )
}

需要自己管理自己的状态,外部组件不需要知道里面组件的状态

React没有像Redux一样直接使用state = initailState, 这是因为可能传入的inital value 是基于props的,所以没有从内部自己定义。

懒初始化

传入第三个参数, init函数,则初始值会被set 为 init(initialArg)。这样可以把计算初始state的逻辑从reducer中抽离出来,对根据action的结果重置state也非常方便。

function init(initialCount) {
  return {count: initialCount};
}

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    case 'reset':
      return init(action.payload);
    default:
      throw new Error();
  }
}

function Counter({initialCount}) {
  const [state, dispatch] = useReducer(reducer, initialCount, init);
  return (
    <>
      Count: {state.count}
      <button
        onClick={() => dispatch({type: 'reset', payload: initialCount})}>
        Reset
      </button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
    </>
  );
}

useCallback

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

a, b是依赖项。将会返回一个callback的记忆版本,只有当依赖项有改变时,才会改变。对根据引用相等进行了渲染优化后的子组件,传入callback很有效果。

useCallback(fn, deps) === useMemo(() => fn, deps)

useMemo

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

传给useMemo的函数会在渲染时执行。后续react可能会遗忘掉一些不在页面上的组件的memo,重新计算它们。慎用。

useRef

const refContainer = useRef(initialValue)

返回一个可变的ref object,其.current属性由传入的参数初始化。返回的对象会在组件的生命周期内一直存在。
比如,明确命令式地获取一个child。

function TextInputWithFocusButton() {
  const inputEl = useRef(null)
  const onButtonClick = () => {
    inputEl.current.focus()
  }
  return (
    <>
      <input ref={inputEl} />
      <button onClick = {onButtonClick}>focus the input</button>
    </>
  )
}

useImperativeHandle

useImperativeHandle(ref, createHandle, [dep1, dep2, …])
生成一个自动focus的输入框子组件:

function FancyInput(props, ref) {
  const inputRef = useRef()
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus()
    }
  }))
  return <input ref={inputRef} ... />
}
FancyInput = forwardRef(FancyInput)

useLayoutEffect

如果要把代码从class component迁移到函数式的,注意useLayoutEffect会在componentDidMount和componentDidUpdate的时候每次都触发。更推荐用useEffect.
如果使用了服务端渲染,注意无论是useLayoutEffect还是useEffect都会直到js被下载才会执行。

useDebugValue

useDebugValue(value, (value) => computed(value))
用于在react dev tools中显示该label, 在定义customHoook 共享库的时候可以使用。第二个参数用于懒初始化。

FAQ

hooks 会替代 render props 和 hoc 吗?
通常,render props和 hoc 都只能渲染一个子组件。但这二者仍然有独特的使用场景。比如说,一个虚拟的滚动组件,可能需要有renderItemprop,或者是一个有特定dom结构的容器组件。不过对大多数情况下,hook可以替代它们。

组件的生命周期和hook是如何对应的?
constructor在函数式组件中不存在,可以在useState中初始化state,如果计算初始state很耗费性能,可以传个函数给useState。getDerivedStateFromProps是通过每一次render执行更新的。shouldComponentUpdate 参见React.memo。render方法就是函数体本身。componentDidMount, componentDidUpdate, componentWillUnmount被useEffect包括在内。componentDidCatch, getDerivedStateFromError 暂时还没有等价的hook方法,但以后会被增加上。

有没有类似实例变量的东西?
有!useRef并不仅仅用于dom refs。ref对象是一个通用容器,其current属性是手动可变的,里面能放任何值,就像class上的实例属性一样。

// component.js
function Timer() {
  const intervalRef = useRef();

  useEffect(() => {
    const id = setInterval(() => {
      // ...
    });
    intervalRef.current = id;
    return () => {
      clearInterval(intervalRef.current);
    };
  });

  // ...
}

// 如果想在某个时间Handler上清理该interval,则可以这么做
function handleCancelClick() {
  clearInterval(intervalRef.current)
}

尽量不要在渲染的时候设置refs, 可能会导致意想不到的结果,最好是在事件处理和effect中修改refs。

是否可以只在更新的时候run effect?
这个用例很少见。不过若是需要,可以使用useRef中的可变ref来存一个布尔值,判断是否是第一次渲染,然后在effect里检查该值。

如何拿到上一次的prop或者state?

function usePrevious(value) {
  const ref = useRef()
  useEffect(() => {
    ref.current = value
  })
  return ref.current
}

function Counter() {
  const [count, setCount] = useState(0)
  const prevCount = usePrevious(count)
  return (<h1>now: {count}, before: {prevCount}</h1>)
}

注意这里useEffect的时机,它是在render之后重新clean up 并执行的。其结果并不会触发重新render,因此能拿到上一次useEffect的结果。如果再在useEffect中setState,则会重新触发渲染,这样的话会render两次,就不能起到usePrevious的结果了。

为什么我在函数方法内部看到了未更新的prop或者state?
任何组件内的方法,包括事件handler和effects,都是从它被触发的那一刻render出的props和state中读取的值。

function Example() {
  const [count, setCount] = useState(0);

  function handleAlertClick() {
    setTimeout(() => {
      alert('You clicked on: ' + count);
    }, 3000);
  }

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
      <button onClick={handleAlertClick}>
        Show alert
      </button>
    </div>
  );
}

如果先点了alert按钮,再点了增加按钮,那么会看到alert出来的值是你点击那一刻时count的值。
另外一个可能的原因是错误地用了依赖项数组优化,比如传了一个空数组作为第二个参数,但又在内部获取了prop,那只能拿到最初的prop了。

如何处理dom元素?
推荐用useCallback,也可以用useRef和useEffect结合,但是useCallback的话传入的第二个参数可以是一个空数组,避免重复渲染,而useEffect会多渲染一次,以确认前后值不变。例子参见usecallback-on-node.js和useref-on-node.js。

function MeasureExample() {
  const [rect, ref] = useClientRect();
  return (
    <>
      <h1 ref={ref}>Hello, world</h1>
      {rect !== null &&
        <h2>The above header is {Math.round(rect.height)}px tall</h2>
      }
    </>
  );
}

function useClientRect() {
  const [rect, setRect] = useState(null);
  const ref = useCallback(node => {
    if (node !== null) {
      setRect(node.getBoundingClientRect());
    }
  }, []);
  return [rect, ref];
}

建议在useEffect, useMemo, useCallback, useImperativeHandle内部写定义的小函数,否则容易忘掉哪些依赖项。依赖项要包括用到的state, prop或者从这两者算出来的值。

  useEffect(() => {
    let ignore = false;
    async function fetchProduct() {
      const response = await fetch('http://myapi/product/' + productId);
      const json = await response.json();
      if (!ignore) setProduct(json);
    }
    return () => { ignore = true };
  }, [productId]);

如果你就是不想把方法写在effect内部,考虑下别的选择:

  • 把函数移到组件之外
  • 如果这是一个纯计算函数,而且可以在渲染时安全地调用,可以在effect外部去调用,然后让返回值作为effect的依赖项之一。
  • 最后,实在不行的话,还可以在effect依赖项中增加一个函数,但把它的定义包裹在useCallback中。这确保了不会在每次渲染的时候不会都去更新,只有在依赖项改变的时候才更新。例子参见update-outside-effect.js。
  1. how to throttle render?

对setState采用函数式的更新,即传入一个函数,而不是一个值,从而尽可能去掉useEffect中的依赖项。这样做仍然会重新渲染和重新setState,但是不会重新调用setInterval之类的async函数。见例子prevent-restart-interval.js。
对比较复杂的情况,比如一个state依赖于另一个state,可以使用useReducer把更新state的逻辑提出来放在外面。参见此文:https://adamrackis.dev/state-and-use-reducer/useReducer的dispatch方法永远是稳定恒等的,即使组件内声明的reducer函数会用到props。
实在不行,那就用useRef替代useState来存取手动修改的变量吧!例子参见manually-render-useref.js

【React】React全家桶(五)React Hooks 阅读详情

相关推荐

React-Hooks 和 React-Redux

React-Hooks 的 使用 React-redux 的 使用

luoxiaonuan_hi的博客 1538

hooks的常用Api

Ref Hook Ref Hook可以在函数组件中存储/查找组件内的标签或其他数据 语法:const refContainer = useRef() 作用:保存标签对象,功能与React.creatRef()一样 Effect Hook 1、Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子) 2、React中副作用操作: 发ajax请求数据获取 设置订阅/启动定时器 手动更改真实DOM 3、语法和说明 useEffect(()=>{ //在此可以执

m0_57479235的博客 688

React Hooks API及useCoordinates自定义Hook实践指南

Click me</button>

weixin_42596011的博客 1187

React Hooks 常用API

文章目录useStateuseEffectuseReduceruseCallbackuseMemouseRefuseLayoutEffectuseContext useState // 返回一个 state,以及更新 state 的函数。 initialState 为初始值 // initialState 参数只会在组件的初始渲染中起作用,后续渲染时会被忽略 const [state, setState] = useState(initialState); // 更新state值的两种方法 setStat

通俗易懂 1368

Verilog的综合指令

Synopsys综合指令

烟花一时的博客 5441

CXL技术入门:从PCIe到高性能计算的桥梁(附最新2.0协议解析)

本文深入解析CXL技术如何作为PCIe的进化版,成为高性能计算的关键桥梁,特别聚焦CXL 2.0协议的关键升级。从技术架构、三大子协议到典型应用场景,全面介绍CXL在缓存一致性、内存共享等方面的优势,帮助开发者快速掌握这一前沿技术。

wdx012345的博客 727

深入了解 React Hooks API:自定义 Hooks 的魅力

Hooks 是 React 16.8 引入的一组 API,使得函数组件可以使用 state 和其他 React 特性。Hooks 的出现使得我们可以在函数组件中处理副作用、添加 state、处理组件生命周期等。他们不影响组件的结构,但提供了一种更加优雅和可组合的方式来管理组件逻辑。useStateuseEffectuseContext等等自定义 Hooks 是 React Hooks API 的一个强大特性。

有我更精彩的博客 1322

XR Interaction Toolkit实战:为HTC Vive Cosmos打造抓取、投掷与UI交互(Unity 2023教程)

本文详细介绍了如何使用Unity 2023和XR Interaction Toolkit为HTC Vive Cosmos开发抓取、投掷与UI交互系统。通过实战案例'VR投掷训练室',从基础配置到高级功能实现,涵盖物理抓取、精准投掷机制和VR UI交互设计,帮助开发者提升VR交互开发技能。

weixin_30562507的博客 252

【渗透测试】利用hook技术破解前端JS加解密 - JS-Forward

在做渗透测试项目时,尤其是金融方面,经常会遇到前端JS加解密技术,看着一堆堆密密麻麻的密文,会给人一种无力感。Hook技术则会帮助我们无需获取加解密密钥的前提下,获取明文进行渗透测试

网络安全从业者的学习笔记 1892

Homebrew 必备软件清单:我的 macOS 开发环境搭建全记录

本文详细介绍了如何使用Homebrew在macOS上搭建高效的开发环境,包括基础配置、核心开发工具链、高效编码工具集等30个必备工具。通过Homebrew这一macOS缺失的包管理器,开发者可以一键安装命令行工具和GUI应用,大幅提升工作效率。文章还提供了日常维护命令和疑难问题解决方案,适合从新手到资深开发者的所有用户。

weixin_28836507的博客 353

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

React Hooks 实战案例

在 React 之前的版本中,组件要么是函数组件,要么是类组件。函数组件可以使用纯函数的方式编写,但是没有状态(state)和其他 React 特性;类组件则可以拥有状态和其他 React 特性,但是需要使用 class 语法来定义。React Hooks 就是在函数组件中引入了状态和其他 React 特性的工具。useState:在函数组件中添加状态,相当于在类组件中使用 this.state。

程序边界 6815

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5063

React Hooks详解

React的函数式组件式本身是没有状态的和其他类似于class组件的功能,所以一开始,函数组件一般只作为容器组件存在,用来展示父级组件传入的值。而16.8之后出现的 hooks(钩子),打开了函数式组件的新大门。 useState 作用:用来记录函数式组件的状态。 使用方式: import React, { useState } from 'react' const [n, setN] = React.useState(0) 例子: import React, {useState} from

duansamve的博客 6331

【图像超分】论文复现:CVPR 2024 | 轻量化超分 | 窗口注意力改进 | CAMixerSR的Pytorch源码复现,跑通源码,获得指标和超分结果,计算复杂度,架构梳理拆解,逐行注释!

本文介绍了超分辨率重建方法CAMixerSR的代码实现与运行指南。文章亮点包括:完整跑通源码获取PSNR/SSIM指标和可视化结果;详细解析模型架构与关键代码注释,帮助快速复现基线模型。实验部分提供了测试配置文件和训练设置说明,支持2K/4K/8K大图像超分和x2/x4轻量化超分。环境依赖PyTorch和BasicSR框架,数据集包含DIV2K等常用基准。测试结果与论文指标一致,可视化输出保存至指定目录。训练配置可自定义数据集路径、GPU数量等参数。该实现突出了CAMixerSR在降低W-MSA复杂度方面的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 436

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入浅出 React Hooks

React Hooks 是什么? Hooks 顾名思义,字面意义上来说就是 React 钩子的概念。通过一个 case 我们对 React Hooks 先有一个第一印象。 假设现在要实现一个计数器的组件。如果使用组件化的方式,我们需要做的事情相对更多一些,比如说声明 state,编写计数器的方法等,而且需要理解的概念可能更多一些,比如 Javascript 的类的概念,this 上下文的指向等...

大灰狼的小绵羊哥哥的博客 5231

深度学习工具包 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")

对比 React Hooks 和 Vue Composition API

场景Hook 的时代意义React HooksVue Composition APIReact HooksvsVue Composition API总结场景先理解什么是hook,拿r...

奇舞周刊 2622

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

React Hooks

React Hooks 是 React 16.8 引入的功能,使函数组件能使用状态和生命周期等特性。它简化代码结构,提高复用性,替代类组件的复杂逻辑。核心 Hooks 包括:useState(状态管理)、useEffect(副作用处理)、useContext(跨组件数据传递)、useReducer(复杂状态逻辑)、useCallback/useMemo(性能优化)、useRef(DOM 操作)等。此外,开发者可创建自定义 Hooks 封装复用逻辑。Hooks 仅用于函数组件,使代码更简洁高效,同时保持 Re

likuoelie的博客 991

react之Hooks用法小结

很多公司现在慢慢使用hooks配合ant-design来进行开发,并且结合ts。下面引用一篇文章来谈谈自己的理解。 1、useState用来保持组件状态 因为hooks使用的前提是一个函数组件,但是函数组件里面又没有this, import React, { useState } from "react"; function App() { const [obj, setObject] = useState({ count: 0, name: "alife" }); r.

liusongyu123的博客 1056

React 之 Hooks

React Hooks 如 useState 和 useEffect 赋予函数组件状态与副作用处理能力,提升逻辑复用性与代码可维护性。理解纯函数、副作用及依赖数组机制,是掌握 Hooks 的关键。

2302_80706750的博客 1241

一文讲清楚React Hooks

React Hooks是React 16.8引入的新特性,允许在函数组件中使用状态和生命周期等特性。主要包括:1) useState管理组件状态;2) useEffect处理副作用操作;3) useContext共享上下文数据。其他常用Hooks还有useReducer处理复杂状态、useCallback和useMemo优化性能、useRef获取DOM引用。Hooks解决了类组件代码复用困难、逻辑分散等问题,使函数组件具备类组件的全部能力,同时提供更简洁的代码组织和更好的性能优化手段。

xiaobangkeji的博客 1320

React开发高级篇 - React Hooks以及自定义Hooks实现思路

初始状态(initialState):这是 state 的初始值。更新函数(setState):这是一个你可以调用以更新 state 的函数。当前状态(current state):这是 state 的当前值。更新函数(setState):用于更新 state 的函数。具体解释:useState 允许你在函数组件内部使用状态。这是通过将状态存储在组件的执行上下文中实现的,而不是像类组件那样存储在实例对象中。

qq_37779333的博客 1984

React Hooks 与 Vue Composition API 的区别

React Hooks 和 Vue Composition API 都是用于函数组件的 API,它们都提供了一种在函数组件中使用状态和生命周期钩子的方式。尽管它们有一些相似之处,但它们在设计哲学、使用方式和适用场景上存在一些关键的区别。通过理解这些区别,开发者可以更好地选择和使用这些 API,满足项目的需求。希望本文对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言讨论。

你若盛开,清风自来 1244

React Hooks 深入浅出

React Hooks 是 React 16.8 版本中引入的特性,它彻底改变了 React 组件的编写方式。在 Hooks 出现之前,我们需要使用类组件来管理状态和生命周期,而函数组件则被视为"无状态组件"。Hooks 的出现使得函数组件也能够拥有状态和生命周期功能,从而简化了组件逻辑,提高了代码的可读性和可维护性。

exlink2012的专栏 943

React Hooks 核心规则&自定义 Hooks

自定义 Hooks 的核心价值是 “逻辑复用” 和 “代码拆分”,无论是公共操作的复用,还是业务组件内复杂逻辑的提取,都是其典型使用场景。具体来说,是否需要将逻辑放入自定义 Hooks,可从 “复用性” 和 “代码整洁度” 两个维度判断。

知识点沉淀包括不限于前端 1465
上一篇: 第一次接私活 && 第一次做微信小程序
下一篇: 消息服务实践
十方魔
博客等级 码龄10年 202粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值