React学习笔记

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

1. react脚手架

初始化项目

npx create-react-app my-app

2. Hooks

以 use 开头的函数,只能在组件或自定义 Hook 的最顶层调用,不能在条件语句、循环语句或其他嵌套函数内调用 Hook。

useState

在组件中添加状态变量

const [state, setState] = useState(initialState);

useEffect

侦听状态变化,并执行相应逻辑

useEffect(setup, dependencies?)

不带参数的 useEffect 函数中不能使用useState方法来改变state,否则会触发无限循环

//不带参数,每次渲染后执行
useEffect(() => {
    console.log("count", count);
});

当 useEffect 带参数时,参数的变化才会触发 useEffect 的执行,不变化不执行。可使用 useState

useEffect(() => {
    console.log("count", count);
    console.log("num", num);
}, [num]);

当 useEffect 传入空参数 [] 时,只有当第一次渲染(mount) 和不渲染(unmount)时执行。

useEffect(() => {
    console.log("count", count);
}, []);

useContext

父子组件传递状态数据。createContext 能够创建组件间共享的上下文状态,然后通过 useContext 在组件中使用这些状态

import { createContext, useContext } from 'react';

const ThemeContext = createContext(null);

export default function MyApp() {
  return (
    <ThemeContext.Provider value="dark">
      <Button>显示的主题</Button>
    </ThemeContext.Provider>
  )
}

function Button({ children }) {
  const theme = useContext(ThemeContext);
  const className = 'button-' + theme;
  return (
    <button className={className}>
      {children}
    </button>
  );
}

useReducer

useReducer 是 useState 的替代方案。当你想更新的状态中包含多个子值时 或者 当你想更新一个状态,并且这个状态更新依赖于另一个状态的值时,可以使用useReducer,reducer 可以让你把组件内发生了什么(actions)和状态如何响应并更新分开表述。
结合useContext 可以实现 Redux 组件间共享状态管理

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

第三个参数如果没值,则将初始状态设置为initialArg。否则,将初始状态设置为呼叫init(initialArg)的结果

import { useReducer } from 'react';

function reducer(state, action) {
  switch (action.type) {
    case "minus_age":
      return {
        age: state.age > 0 ? (state.age - 1) : 0
      };
    default:
      return {
        age: state.age + 1
      };
  }
}

export default function Counter() {
  const [state, dispatch] = useReducer(reducer, { age: 42 });
  return (
    <>
      <button onClick={() => {
        dispatch({ type: 'add_age' })
      }}>
        Add age
      </button>
      <button onClick={() => {
        dispatch({ type: 'minus_age' })
      }}>
        Minus age
      </button>
      <p>Hello! You are {state.age}.</p>
    </>
  );
}

和useState的setState不一样的是,useReducer返回的dispatch函数是用来触发某些改变state的action而不是直接设置state的值

useMemo

相当于计算属性

const cachedValue = useMemo(calculateValue, dependencies)
 export default function Counter() {
   const clickFn = useMemo(() => {
      let sum = 0;
      for (let i = 0; i < 100*count; i++) {
        sum += i;
      }
      return sum;
   },[count]);
   //当依赖的count发生改变才去重新计算,return值出来
   
   return(
     <div>获得总数{clickFn}</div>
   )   
}

useCallback

避免子组件不必要的重新渲染,依赖数据改变传入新函数否则保留原函数

const cachedFn = useCallback(fn, dependencies)

useMemo和useCallback接收的参数都是一样,都是在其依赖项发生变化后才执行,都是返回缓存的值。而useEffect没有返回
区别在于useMemo返回的是函数运行的结果,useCallback返回的是函数。
useCallback(fn, deps) 与 useMemo(() => fn, deps). 是等价的,

useRef

useRef 返回一个引用了DOM的对象,返回的对象将在组件的整个生存期内持续存在。相当于为this赋值

const ref = useRef(initialValue)
import { useRef } from 'react';

export default function Form() {
  const inputRef = useRef(null);
  
  function handleClick() {
    //点击使input框获取焦点
    inputRef.current.focus();
  }

  return (
    <>
      <input ref={inputRef} />
      <button onClick={handleClick}>
        Focus the input
      </button>
    </>
  );
}

useRef和createRef的区别是createRef 每次渲染都会返回一个新的引用,而 useRef 每次都会返回相同的引用,可以在 useRef 对象上存放缓存的值。

3. API

forwardRef

转发ref,将dom暴露给父组件

import { forwardRef, useRef } from 'react';

const MyInput = forwardRef(function MyInput(props, ref) {
  return (
    <label>
      {props.label}
      <input ref={ref} />
    </label>
  );
});

export default function Form() {
  const ref = useRef(null);

  function handleClick() {
    ref.current.focus();
  }

  return (
    <form>
      <MyInput label="Enter your name:" ref={ref} />
      <button type="button" onClick={handleClick}>
        Edit
      </button>
    </form>
  );
}

使用forwardRef和useImperativeHandle限制父组件调用子组件的Api

import { forwardRef, useRef, useImperativeHandle } from 'react';

const MyInput = forwardRef(function MyInput(props, ref) {
  const inputRef = useRef(null);
  
  useImperativeHandle(ref, () => {
    return {
      focus() {
        inputRef.current.focus();
      },
      scrollIntoView() {
        inputRef.current.scrollIntoView();
      },
    };
  }, []);
  
  return <input {...props} ref={inputRef} />
});

export default function Form() {
  const ref = useRef(null);

  function handleClick() {
    //父组件获得了 MyInput 的 ref,能通过该 ref 来调用 focus 和 scrollIntoView 方法
    //但是它的访问是受限的,无法读取或调用下方 <input> DOM 节点的其他所有属性和方法
    ref.current.focus();
    // 下方代码不起作用,因为 DOM 节点并未被暴露出来:
    // ref.current.style.opacity = 0.5;
  }

  return (
    <form>
      <MyInput label="Enter your name:" ref={ref} />
      <button type="button" onClick={handleClick}>
        Edit
      </button>
    </form>
  );
}

ref有一个current属性,可以对这个属性进行操作,用于获取DOM元素和保存变化的值。
不要滥用ref,仅在没法通过 prop 来表达 命令式 行为的时候才使用 ref,比如滚动到指定节点、聚焦某个节点、触发一次动画、选择文本等
如果可以通过prop实现,就不要使用ref ,useEffect 可以通过 prop 来暴露一些命令式的行为文章来源地址https://www.toymoban.com/news/detail-423252.html

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

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

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

相关文章

  • Vue 新版 脚手架 初始化 笔记

    Vue2/Vue3 修改 node 更新源 将默认的 更新源修改为 淘宝的 下载地址 安装 一般 新版 Vue 脚手架不可以共存 所以如果有 旧版的脚手架 会提示你 需要卸载 原来的脚手架 然后重新执行上面的安装 安装好之后 就可以去初始化项目了 值得一提的是我在官方的文档中找到了一个 在使

    2024年02月20日
    浏览(37)
  • 创建react脚手架项目——demo(react18 + react-router 6)+ react项目打包部署

    全局安装 create-react-app 说明:不建议安装全局,建议使用 npx 命令安装,具体可参考官网,如下: 官网: https://zh-hans.legacy.reactjs.org/docs/create-a-new-react-app.html. 1.2.1 问题1——npm ERR! code ENOTFOUND(网络问题clashx) 问题描述,如下: 解决问题——方式1 如果使用了clashx,可能是它

    2024年02月07日
    浏览(73)
  • Webpack5入门到原理19:React 脚手架搭建

    package.json .eslintrc.js babel.config.js webpack.config.js 修改运行指令 package.json

    2024年01月21日
    浏览(53)
  • react快速开始(三)-create-react-app脚手架项目启动;使用VScode调试react

    create-react-app(以下简称cra)作为react官方提供的脚手架工具,是目前生成react项目一个非常常用和主流的工具。很多企业级的应用搭建也是基于这个脚手架工具上二次开发 create-react-app脚手架 生成的 package.json中 scripts如下: 我们看到分别是项目的启动开发环境,构建,测试的

    2024年02月10日
    浏览(60)
  • react native在windows环境搭建并使用脚手架新建工程

    截止到2024-1-11,使用的主要 软件的版本 如下: 软件实体 版本 react-native 0.73.1 react 18.2.0 react-native-cli 2.0.1 Android Studio 2022.3.1 Patch3 Android SDK Android SDK Platform 33 34 Android SDK Android SDK Tools 33 34 Android SDK Intel x86 Atom_64 System Image Android SDK Google APIs Intel x86 Atom System Image node 20.10.0 yarn 1.

    2024年02月02日
    浏览(48)
  • Vue3脚手架笔记

    Vue模板语法有2大类 : 1.插值语法: 功能:用于解析标签体内容。 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。 ** 2.指令语法:** 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。 举例:v-bind:href=“xxx” 或 简写为 :href=“xxx”,xxx同

    2024年01月24日
    浏览(52)
  • vue3笔记-脚手架篇

    第一章 基础篇 vue2与vue3的一些区别 响应式系统: Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听,它对数据监听是一项项的进行监听,因此,当新增属性发生变化时,它无法监测到,并且响应性能不是很好。 Vue 3 使用 Proxy 来实现响应式系统,它用一个中间代理来管

    2024年02月16日
    浏览(44)
  • 系统性学习vue-组件及脚手架

    书接上文 Vue脚手架是Vue官方提供的标准化开发工具(开发平台) CLI: command line interface (命令行接口工具) 俗称脚手架 备注: 如果下载缓慢可以配置npm淘宝镜像: npm config set registry https://registry.npm.taobao.org Vue脚手架隐藏了所有webpack相关配置,弱项查看具体的webpack配置,请执行 vue ins

    2024年02月02日
    浏览(47)
  • 20230623----重返学习-vue-cli脚手架

    Vue工程化处理工具之 : @vue/cli 脚手架的本质:基于webpack实现项目的打包部署; vue/cli 安装和使用 可选择当前配置项 文件地址在:C:Users当前电脑用户名.vuerc。 如:C:Usersfangc.vuerc 文件目录 package.json 目录: scripts:npm可执行命令 serve命令: vue-cli-service 是Vue脚手架内部封装的

    2024年02月10日
    浏览(65)
  • Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

    在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 在Android Studio(版本是Graffie)中新建模块,选择“Empty Activ

    2024年02月04日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包