react 订阅
《react》是VOCALOID家族的一首歌曲,由黒うさP作词、作曲、编曲;初音ミク、镜音双子演唱,音乐时长4:52。 展开全文
《react》是VOCALOID家族的一首歌曲,由黒うさP作词、作曲、编曲;初音ミク、镜音双子演唱,音乐时长4:52。
信息
编    曲
黒うさP
歌曲时长
4:52
歌曲原唱
初音未来,镜音双子
谱    曲
黒うさP
外文名称
React
歌曲语言
日语
填    词
黒うさP
react主要剧情
这首曲子主要是说在ACUTE中,miku、luka和kaito曾是朋友。kaito和巡音是互相相爱,但PV中没有明确表示他们是情侣关系,但是初音爱上了kaito并向他表白,后来miku出国,luka和kaito发生过暧昧关系后感觉有一股罪恶感,不再找miku,miku很嫉妒luka,于是用刀刺伤了kaito,又拿起刀子自杀。之后好友Rin带len来看好朋友miku,len【镜音レン】喜欢上了初音,但是rin【镜音リン】很久就喜欢len,知道了len喜欢上miku然后产生憎恨,不希望len再一次离开自己,最后用刀刺向len,想把len带走。让miku想起了acute里的情节(她想把kaito带走这一个情节),被miku拦住了,刀刺中了miku。在最后的片段kaito在luka的照顾下康复,rin在miku身旁痛苦地哭泣。(本为官网剧情)。
收起全文
精华内容
下载资源
问答
  • react
    千次阅读
    2022-03-30 08:08:00

    我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情

    React 18 中的新增功能

    新功能:Automatic Batching

    批处理是指 React 将多个状态更新分组到单个重新呈现中以获得更好的性能。在没有自动批处理的情况下,我们只在 React 事件处理程序中批处理更新。默认情况下,promises、setTimeout、本机事件处理程序或任何其他事件内部的更新不会在 React 中进行批处理。使用自动批处理时,将自动批处理这些更新:

    // Before: only React events were batched.
    setTimeout(() => {
      setCount(c => c + 1);
      setFlag(f => !f);
      // React will render twice, once for each state update (no batching)
    }, 1000);
    
    // After: updates inside of timeouts, promises,
    // native event handlers or any other event are batched.`
    setTimeout(() => {
      setCount(c => c + 1);
      setFlag(f => !f);
      // React will only re-render once at the end (that's batching!)
    }, 1000);
    

    新功能:Transitions

    Transitions是 React 中的一个新概念,用于区分紧急和非紧急更新。

    紧急更新反映了直接交互,如打字、单击、按下等。

    过渡更新将 UI 从一个视图转换为另一个视图。

    紧急更新,如打字,点击或按下,需要立即响应,以匹配我们对物理对象行为方式的直觉。否则他们会觉得"错了"。但是,过渡是不同的,因为用户不希望在屏幕上看到每个中间值。

    例如,当您在下拉列表中选择筛选器时,您希望筛选器按钮本身在单击时立即响应。但是,实际结果可能会单独转换。一个小小的延迟是难以察觉的,而且往往是意料之中的。如果在结果渲染完成之前再次更改滤镜,则只需查看最新结果即可。

    通常,为了获得最佳用户体验,单个用户输入应同时导致紧急更新和非紧急更新。您可以在输入事件中使用 startTransition API 来通知 React 哪些更新是紧急的,哪些是"转换":

    import {startTransition} from 'react';
    
    // Urgent: Show what was typed
    setInputValue(input);
    
    // Mark any state updates inside as transitions
    startTransition(() => {
      // Transition: Show the results
      setSearchQuery(input);
    });
    

    startTransition 中包装的更新将作为非紧急更新进行处理,如果出现更紧急的更新(如单击或按键),则会中断。如果一个过渡被用户打断(例如,通过连续键入多个字符),React 将抛出未完成的陈旧的渲染工作,只渲染最新的更新。

    useTransition:用于启动转换的挂钩,包括用于跟踪挂起状态的值。

    startTransition:一种在无法使用挂钩时启动转换的方法。

    转换将选择加入并发渲染,从而允许中断更新。如果内容重新挂起,过渡还会告诉 React 继续显示当前内容,同时在后台呈现过渡内容(有关详细信息,请参阅悬念 RFC)。

    在此处查看有关过渡的文档.

    新的Suspense功能

    Suspense 允许您以声明方式指定组件树的某个部分的加载状态(如果该部分尚未准备好显示):

    <Suspense fallback={<Spinner />}>
      <Comments /></Suspense>
    

    Suspense 使"UI 加载状态"成为 React 编程模型中的第一类声明性概念。这使我们能够在其上构建更高级别的功能。

    几年前,我们推出了限量版的悬疑。但是,唯一受支持的用例是使用 React.lazy 进行代码拆分,并且在服务器上渲染时根本不支持。

    在 React 18 中,我们在服务器上添加了对 Suspense 的支持,并使用并发渲染功能扩展了其功能。

    React 18 中的悬念在与过渡 API 结合使用时效果最佳。如果在转换期间挂起,React 将阻止已经可见的内容被回退替换。相反,React 将延迟渲染,直到加载了足够的数据以防止错误的加载状态。

    新的客户端和服务器Rendering APIs

    在此版本中,我们借此机会重新设计了用于在客户端和服务器上呈现的 API。这些更改允许用户在升级到 React 18 中的新 API 时,在 React 17 模式下继续使用旧 API。

    React DOM Client

    这些新的 API 现在从 react-dom/client 导出:

    createRoot:用于创建要render或unmount的根的新方法。使用它而不是 ReactDOM.render。React 18 中的新功能没有它就无法正常工作。

    hydrateRoot:冻结服务器呈现的应用程序的新方法。将它而不是 ReactDOM.hydrate 与新的 React DOM Server API 结合使用。React 18 中的新功能没有它就无法正常工作。

    createRoot 和 hydrateRoot 都接受一个名为 onRecoverableError 的新选项,以防您希望在 React 从渲染或用于日志记录的水化错误中恢复时收到通知。默认情况下,React 将在较旧的浏览器中使用 reportError 或 console.error。

    React DOM Server

    这些新的 API 现在从 react-dom/server 导出,并且完全支持服务器上的流式 Suspense:

    renderToPipeableStream:用于在 Node 环境中进行流式处理。

    renderToReadableStream:适用于现代边缘运行时环境,如 Deno 和 Cloudflare worker。

    现有的 renderToString 方法继续工作,但不鼓励使用。

    新的Strict Mode Behaviors

    以后我们希望添加一个功能,允许 React 在保留状态的同时添加和删除 UI 的各个部分。例如,当用户离开屏幕并返回时,React 应该能够立即显示上一个屏幕。为此,React 将使用与以前相同的组件状态卸载和重新挂载树。

    此功能将为 React 应用程序提供更好的开箱即用性能,但要求组件能够灵活应对多次装载和破坏的效果。大多数效果无需任何更改即可工作,但有些效果假定它们只安装或销毁一次。

    为了帮助解决这些问题,React 18 在严格模式下引入了一个新的仅限开发的检查。每当组件首次装载时,此新检查将自动卸载并重新装载每个组件,并在第二次装载时恢复以前的状态。

    在此更改之前,React 将挂载组件并创建效果:

    • React mounts the component.

      • Layout effects are created.
      • Effects are created.
        在 React 18 中的严格模式中,React 将模拟在开发模式下卸载和重新挂载组件:
    • React mounts the component.

      • Layout effects are created.
      • Effects are created.
    • React simulates unmounting the component.

      • Layout effects are destroyed.
      • Effects are destroyed.
    • React simulates mounting the component with the previous state.

      • Layout effects are created.
      • Effects are created.

    新Hooks

    useId

    useId 是一个新的钩子,用于在客户端和服务器上生成唯一 ID,同时避免水化不匹配。它主要用于与需要唯一 ID 的辅助功能 API 集成的组件库。这解决了 React 17 及更低版本中已经存在的问题,但在 React 18 中更为重要,因为新的流式处理服务器呈现器如何无序地交付 HTML。

    useTransition

    useTransition 和 startTransition 允许您将某些状态更新标记为不紧急。默认情况下,其他状态更新被视为紧急。React 将允许紧急状态更新(例如,更新文本输入)以中断非紧急状态更新(例如,呈现搜索结果列表)。

    useDeferredValue

    useDeferredValue 允许您推迟重新呈现树的非紧急部分。它类似于去抖动,但与它相比具有一些优点。没有固定的时间延迟,所以 React 会在第一个渲染反映在屏幕上后立即尝试延迟渲染。延迟的渲染是可中断的,并且不会阻止用户输入。

    useSyncExternalStore

    useSyncExternalStore 是一个新的挂钩,它允许外部存储通过强制对存储的更新进行同步来支持并发读取。在实现对外部数据源的订阅时,它消除了对 useEffect 的需求,并且建议用于与 React 外部的状态集成的任何库。

    注意:useSyncExternalStore 旨在供库使用,而不是应用程序代码。

    useInsertionEffect

    useInsertionEffect 是一个新的钩子,它允许 CSS-in-JS 库解决在渲染中注入样式的性能问题。除非你已经构建了一个CSS-in-JS库,否则我们不希望你使用它。此挂钩将在 DOM 发生突变后运行,但在布局效果读取新布局之前运行。这解决了 React 17 及更低版本中已经存在的问题,但在 React 18 中更为重要,因为 React 在并发渲染期间让位于浏览器,使其有机会重新计算布局。

    注意:useInsertionEffect 旨在供库使用,而不是应用程序代码。

    更多相关内容
  • React Developer Tools Chrome插件 官方版

    热门讨论 2017-07-01 11:10:10
    React Developer Tools 2.3.3 Chrome插件 官方版
  • React中文入门教程 pdf 下载

    热门讨论 2017-03-19 10:52:57
    React中文入门教程
  • 完全征服React Native

    万人学习 2016-08-22 11:47:32
    React Native是Facebook于2015年推出的跨平台开发... 本课程采用新的ES6开发,主要内容包括ReactNative的基础知识,ReactNative的布局,组件,API,封装本地API和组件,发布ReactNative App,本地与ReactNative深度结合
  • 2022 年的 React 生态

    万次阅读 2022-04-17 01:08:44
    关注公众号前端开发博客,领27本电子书回复加群,自助秒进前端群转载公众号:code秘密花园作者:ConardLi今天我们来聊ReactReact已经风靡前端届很长一段时间了,在这段时间里它发展了一个非常全面而强大的生态系统...

    关注公众号 前端开发博客,领27本电子书

    回复加群,自助秒进前端群

    转载公众号:code秘密花园 

    作者:ConardLi

    今天我们来聊 ReactReact 已经风靡前端届很长一段时间了,在这段时间里它发展了一个非常全面而强大的生态系统。大厂喜欢在大型的前端项目中选择 React,它的生态功不可没。

    今天的文章,我们我们将从状态管理、样式和动画、路由、代码风格等多个方面来看看 React 最新的生态,希望你以后在做技术选型的时候能够有所帮助。

    创建 React 项目

    f2ca824eb4b0e07053ab716157540fad.png

    对于大多数 React 初学者来说,在刚刚开始学习 React 时如何配置一个 React 项目往往都会感到迷惑,可以选择的框架有很多。React 社区中大多数会给推荐 Facebook 的 create-react-app (CRA)。它基本上零配置,为你提供开箱即用的简约启动和运行 React 应用程序。

    d32856fd9ff4dc9a81d5a66885974e55.png

    但现在来看,CRA 使用的工具过时了 — 从而导致我们的开发体验变慢。Vite 是近期最受欢迎的打包库之一,它具有令人难以置信的开发和生产速度,而且也提供了一些模板(例如 React、React + TypeScript)可以选择。

    b3bf1f5185f8b5e81b58a525d937938a.png

    如果你已很经熟悉 React 了,你可以选择它最流行的框架之一作为替代:Next.js 和 Gatsby.js。这两个框架都基于 React 建立,因此你应该至少熟悉了 React 的基础知识再去使用。这个领域另一个流行的新兴框架是 Remix,它在 2022 年绝对值得一试。

    d4de2061f0bd308ee61c59bc6791e52f.png

    虽然 Next.js 最初是用来做服务端渲染的,而 Gatsby.js 主要用来做静态站点生成(例如博客和登录页面等静态网站)。然而,在过去几年里,这两个框架之间一直在互相卷...

    Next.js 可以支持你生成静态站点,而 Gatsby.js 也支持了服务端渲染。不过就我个人的使用体验而言,我会觉得 Next.js 更好用一点。

    如果你只想了解一下 create-react-app 这些工具在后台的工作原理,建议尝试一下自己从头开始配置一个 React 项目。从一个简单的 HTML JavaScript 项目开始,并自己添加 React 及其支持工具(例如 Webpack、Babel)。这并不是你在日常工作中必须要做的事情,但这是了解底层工具实现原理的一个很好的方式。

    建议:

    • 优先使用 Vite 创建 React 客户端应用

      • CRA 备选

    • 优先使用 Next.js 创建 React 服务端渲染应用

      • 最新技术:Remix

      • 仅创建静态站点备选 Gatsby.js

    • 可选的学习经验:从0自己搭建一个 React 应用。

    链接:

    • create-react-app:https://github.com/facebook/create-react-app

    • Vite:https://github.com/vitejs/vite

    • Next.js:https://github.com/vercel/next.js

    • Gatsby.js:https://github.com/gatsbyjs/gatsby

    • Remix:https://github.com/remix-run/remix

    阅读:

    • 《React 基础》:https://beta.reactjs.org/learn

    • 《了解为什么像 React 这样的框架很重要》:https://www.robinwieruch.de/why-frameworks-matter/

    • 《如何创建现代 JavaScript 项目》:https://www.robinwieruch.de/javascript-project-setup-tutorial/

    • 《Gatsby vs. Next.js vs. Remix》:https://satellytes.com/blog/getting-started-gatsby-next-remix/

    • 《React 框架运行时优化方案的演进》:https://mp.weixin.qq.com/s/4qzm5pFmvdDUncN4txiBPA


    状态管理

    ad0a2a268b734f083f6739c868dfd2c8.png

    React 带有两个内置的 Hooks 来管理本地状态:useState 和 useReducer。如果需要全局状态管理,可以选择加入 React 内置的 useContext Hook 来将 props 从顶层组件传递到底层组件,从而避免 props 多层透传的问题。这三个 Hooks 足以让你实现一个强大的状态管理系统了。

    如果你发现自己过于频繁地使用 React 的 Context 来处理共享/全局状态,你一定要看看 Redux,它是现在最流行的状态管理库。它允许你管理应用程序的全局状态,任何连接到其全局存储的 React 组件都可以读取和修改这些状态。

    ab2770f1e026bbb106ea40b1159cc1dc.png

    如果你碰巧在用 Redux,你一定也应该查看 Redux Toolkit。它是基于 Redux 的一个很棒的 API,极大地改善了开发者使用 Redux 的体验。

    作为替代方案,如果你喜欢用全局存储的思想管理状态,但不喜欢 Redux 的处理方式,可以看看其他流行的本地状态管理解决方案,例如 Zusand、Jotai、XState 或 Recoil 。

    另外,如果你想拥有和 Vue.js 一样的开发体验,建议看看 Mobx 。

    建议:

    • 用 useState/useReducer 处理共享状态

    • 选择性使用 useContext 管理某些全局状态

    • 用 Redux(或另一种选择) 管理全局状态

    链接:

    • Redux:https://redux.js.org/

    • Mobx:https://github.com/mobxjs/mobx

    • Zusand:https://github.com/pmndrs/zustand

    • Jotai:https://github.com/pmndrs/jotai

    • XState:https://github.com/statelyai/xstate

    • Recoil:https://github.com/facebookexperimental/Recoil

    阅读:

    • 《useReducer、useState、useContext 使用指南》:https://www.robinwieruch.de/react-state-usereducer-usestate-usecontext/

    • 《React 体系下关于 Mobx 与 Redux 的一些思考》:https://zhuanlan.zhihu.com/p/461844358

    • 《Facebook 新一代 React 状态管理库 Recoil》:https://juejin.cn/post/6881493149261250568

    • 《使用 React&Mobx 的几个最佳实践》


    远程数据请求

    32169bb372116ac40258e9391f071ab3.png

    React 的内置 Hooks 非常适合 UI 状态管理,但当涉及到远程数据的状态管理(也包括数据获取)时,我建议使用一个专门的数据获取库,例如 React Query,它自带内置的状态管理功能。虽然 React Query 本身的定位并不是一个状态管理库,它主要用于从 API 获取远程数据,但它会为你处理这些远程数据的所有状态管理(例如缓存,批量更新)。

    d82bc32a6ba519322694eee3dcd33787.png

    React Query 最初是为使用 REST API 而设计的,但是现在它也支持了 GraphQL。然而如果你正在为你的 React 项目寻找专门的 GraphQL 库,我还是推荐你去看看 Apollo Client(当前最流行的)、urql(轻量级)或 RelayFacebook 维护)。

    如果你已经在使用 Redux,并且想要在 Redux 中添加集成状态管理的数据请求功能,建议你看看 RTK Query,它将数据请求的功能更巧妙的集成到 Redux 中。

    建议:

    • React Query(REST API、GraphQL API 都有)

    • Apollo Client(只有 GraphQL API)

    • 可选的学习经验:了解 React Query 的工作原理

    链接:

    • React Query:https://react-query.tanstack.com/

    • Apollo Client:https://www.apollographql.com/docs/react/

    • urql:https://formidable.com/open-source/urql/

    • Relay:https://github.com/facebook/relay

    • RTK Query:https://redux-toolkit.js.org/rtk-query/overview

    阅读:

    • 《React Query 的工作原理》:https://www.robinwieruch.de/react-hooks-fetch-data/

    • 《本地和远程数据的 React 状态的一切》:https://www.robinwieruch.de/react-state/


    路由

    64a1e064e941016c3ac6a6bb62bbbbc8.png

    如果你使用的是像 Next.js 或 Gatsby.js 这样的 React 框架,那么路由已经为你处理好了。但是,如果你在没有框架的情况下使用 React 并且仅用于客户端渲染(例如 CRA),那么现在最强大和流行的路由库是 React Router

    链接:

    • React Router:https://reactrouter.com/

    阅读:

    • 《深入 React-Router 实现原理》:https://segmentfault.com/a/1190000023560665


    样式/CSS

    在 React 中有很多关于 样式/CSS 的选项和意见,作为一个 React 初学者,可以使用一个带有所有 CSS 属性的样式对象作为 HTML 样式属性的键/值对,从内联样式和基本的 CSS 开始就可以。

    const ConardLi = ({ title }) =>
      <h1 style={{ color: 'blue' }}>
        {title}
      </h1>

    内联样式可以在 React 中通过 JavaScript 动态添加样式,而外部 CSS 文件可以包含 React 应用的所有剩余样式:

    import './Headline.css';
    
    const ConardLi = ({ title }) =>
      <h1 className="ConardLi" style={{ color: 'blue' }}>
        {title}
      </h1>

    如果你的应用越来越大了,建议再看看其他选项。首先,我建议你将 CSS Module 作为众多 CSS-in-CSS 解决方案的首选。CRA 支持  CSS Module ,并为提供了一种将 CSS 封装到组件范围内的模块的方法。这样,它就不会意外泄露到其他 React 组件的样式中。你的应用的某些部分仍然可以共享样式,但其他部分不必访问它。在 React 中, CSS Module 通常是将 CSS 文件放在 React 组件文件中:

    import styles from './style.module.css';
    
    const ConardLi = ({ title }) =>
      <h1 className={styles.headline}>
        {title}
      </h1>
    6a6d809edd9ec95b5cd356bdfa2c5453.png

    其次,我想向你推荐所谓的 styled components ,作为 React 的众多 CSS-in-JS 解决方案之一。它通过一个名为 styles-components(或者其他例如 emotion 、stitches)的库来实现的,它一般将样式放在 React 组件的旁边:

    import styled from 'styled-components';
    
    const BlueHeadline = styled.h1`
      color: blue;
    `;
    
    const ConardLi = ({ title }) =>
      <BlueHeadline>
        {title}
      </BlueHeadline>
    7f91184927455ff7322fc94a17ef72e4.png

    第三,我想推荐 Tailwind CSS 作为最流行的 Utility-First-CSS 解决方案。它提供了预定义的 CSS 类,你可以在 React 组件中使用它们,而不用自己定义。这可以提升一些效率,并与你的 React 程序的设计系统保持一致,但同时也需要了解所有的类:

    const ConardLi = ({ title }) =>
      <h1 className="text-blue-700">
        {title}
      </h1>

    使用 CSS-in-CSS、CSS-in-js 还是函数式 CSS 由你自己决定。所有的方案在大型 React 应用中都适用。最后一点提示:如果你想在 React 中有条件地应用一个 className,可以使用像 clsx 这样的工具。

    建议:

    • CSS-in-CSS 方案:CSS Modules

    • CSS-in-JS 方案:Styled Components (目前最受欢迎)

      • 备选:Emotion 或 Stitches

    • 函数式 CSS:Tailwind CSS

    • 备选:CSS 类的条件渲染:clsx

    链接:

    • styled-components:https://www.robinwieruch.de/react-styled-components/

    • Tailwind CSS:https://tailwindcss.com/

    • clsx:https://github.com/lukeed/clsx

    阅读:

    • 《React中CSS-in-JS的最佳实践》:https://juejin.cn/post/6935245880568053791

    • 《React中的CSS样式》:https://www.robinwieruch.de/react-css-styling/

    • 《10种现在流行的CSS解决方案》:https://juejin.cn/post/6844903633109139464

    • 《CSS-in-JS vs CSS》:https://bejamas.io/blog/css-performance/

    • 《看完了 2021 CSS 年度报告,我学到了啥?》:https://juejin.cn/post/7043577751344775176


    组件库

    对于初学者来说,从零开始构建可复用的组件是一个很好的学习经验,值得推荐。无论它是 dropdown、radio button 还是 checkbox ,你最终都应该知道如何创建这些UI组件组件。

    9cfee04ec2b5bc4e265003501b6dff2c.png

    然而,在某些时候,你想要使用一个UI组件库,它可以让你访问许多共享一套设计系统的预构建组件。以下所有的UI组件库都带有基本组件,如 Buttons、Dropdowns、Dialogs 和 Lists

    • Material UI (MUI) (最流行):https://material-ui.com/

    • Mantine (最推荐):https://mantine.dev/

    • Chakra UI (最推荐):https://chakra-ui.com/

    • Ant Design(国内最流行):https://ant.design/

    • Radix:https://www.radix-ui.com/

    • Primer:https://primer.style/react/

    • NextUI:https://nextui.org/

    • Tailwind UI (收费的):https://www.tailwindui.com/

    • Semantic UI:https://www.robinwieruch.de/react-semantic-ui-tutorial

    • React Bootstrap:https://react-bootstrap.github.io/

    尽管所有这些UI组件库都带有许多内部组件,但它们不能让每个组件都像只专注于一个UI组件的库那样强大。例如 react-table-library 提供了非常强大的表格组件,同时提供了主题(例如 Material UI),可以很好的和流行的UI组件库兼容。

    阅读:

    • 《从零到一搭建React组件库》:https://segmentfault.com/a/1190000039852833


    动画库

    3a6aa5b09b4c2f3db11bc94b6c7d8e81.png

    Web 应用中的大多数动画都是从 CSS 开始的。最终你会发现 CSS 动画不能满足你所有的需求。通常开发者会选择 React Transition Group,这样他们就可以使用 React组件来执行动画了,React 的其他知名动画库有:

    • Framer Motion (最推荐):https://www.framer.com/motion/

    • react-spring (也推荐一下):https://github.com/react-spring/react-spring

    • react-motion:https://github.com/chenglou/react-motion

    • react-move:https://github.com/sghall/react-move

    • Animated (React Native):https://facebook.github.io/react-native/docs/animated


    可视化图表

    a5d287ea385bf96d2478cadf01122bb3.png

    如果你真的想要自己从头开始开发一些图表,那么就没有办法绕过 D3 。这是一个很底层的可视化库,可以为你提供开发一些炫酷的图表所需的一切。然而,学习 D3 是很有难度的,因此许多开发者只是选择一个 React 图表库,这些库默认封装了很多能力,但是缺失了一些灵活性。以下是一些流行的解决方案:

    • Recharts:http://recharts.org/

    • react-chartjs:https://github.com/reactchartjs/react-chartjs-2

    • nivo:https://nivo.rocks/

    • visx:https://github.com/airbnb/visx

    • Victory:https://formidable.com/open-source/victory/


    表单

    9946894ff6c09f5bd2c909b8f17b9501.png

    React 现在最受欢迎的表单库是 React Hook Form 。它提供了从验证(一般会集成 yup 和 zod)到提交到表单状态管理所需的一切。之前流行的另一种方式是 Formik。两者都是不错的解决方案。这个领域的另一个选择是 React Final Form 。毕竟,如果你已经在使用 React UI组件库了,你还可以查看他们的内置表单解决方案。

    建议:

    • React Hook Form

      • 集成 yup 或 zod 进行表单验证

    • 如果已经在使用组件库了,看看内置的表单能不能满足需求

    链接:

    • React Hook Form:https://react-hook-form.com/

    • Formik:https://github.com/jaredpalmer/

    • React Final Form:https://final-form.org/react

    阅读:

    • 《React 开源表单组件最佳实践,原理解析,设计分析》:https://toutiao.io/posts/0nh4r9w/preview


    类型检查

    React 带有一个名为 PropTypes 的内部类型检查。通过使用 PropTypes,你可以为你的 React 组件定义 props。每当将类型错误的 prop 传递给组件时,你可以在运行时收到错误消息:

    import PropTypes from 'prop-types';
    
    const List = ({ list }) =>
      <div>
        {list.map(item => <div key={item.id}>{item.title}</div>)}
      </div>
    
    List.propTypes = {
      list: PropTypes.array.isRequired,
    };
    403e54b0924e0cf2b44c56b1f7895e2d.png

    在过去的几年里,PropTypes 已经不那么流行了,PropTypes 也已经不再包含在 React 核心库中了,现在 TypeScript 才是最佳的选择:

    type Item = {
      id: string;
      title: string;
    };
    
    type ListProps = {
      list: Item[];
    };
    
    const List: React.FC<ListProps> = ({ list }) =>
      <div>
        {list.map(item => <div key={item.id}>{item.title}</div>)}
      </div>

    阅读:

    • 《TypeScript 终极初学者指南》:https://mp.weixin.qq.com/s/6DAyXFHIMW95FS0f3GyHpA

    • 《如何优雅地在 React 中使用TypeScript》:https://juejin.cn/post/7021674818621669389


    代码风格

    dce14e34d1caba64f9a9ae06db3d7aa9.png

    对于代码风格,基本上有两种方案可以选择:

    如果你想要一种统一的、通用的代码风格,在你的 React 项目中使用 ESLint 。像 ESLint 这样的 linter 会在你的 React 项目中强制执行特定的代码风格。例如,你可以在 ESLint 中要求遵循一个流行的风格指南(如 Airbnb 风格指南)。之后,将 ESLint 与你的IDE/编辑器集成,它会指出你的每一个错误。

    如果你想采用统一的代码格式,可以在 React 项目中使用 Prettier。它是一个比较固执的代码格式化器,可选择的配置很少。你也可以将它集成到编辑器或IDE中,以便在每次保存文件的时候自动对代码进行格式化。虽然 Prettier 不能取代 ESLint,但它可以很好地与 ESLint 集成。

    建议:

    • ESLint:https://eslint.org/

    • Prettier:https://github.com/prettier/prettier

    阅读:

    • 《React 代码风格指南》:https://keqingrong.cn/blog/2020-05-04-code-style-guide-for-react/

    • 《Airbnb 样式指南》:https://www.robinwieruch.de/react-libraries/


    身份认证

    a263a71e5de366a6b06385f1f2351009.png

    在 React 应用程序中,你可能希望引入带有注册、登录和退出等功能的身份验证。通常还需要一些其他功能,例如密码重置和密码更改功能。这些能力远远超出了 React 的范畴,我们通常会把它们交给服务端去管理。

    最好的学习经验是自己实现一个带有身份验证的服务端应用(例如 GraphQL 后端)。然而,由于身份验证有很多安全风险,而且并不是所有人都了解其中的细节,我建议使用现有的众多身份验证解决方案中的一种:

    • Firebase:https://www.robinwieruch.de/complete-firebase-authentication-react-tutorial/

    • Auth0:https://auth0.com/

    • AWS Cognito:https://aws.amazon.com/cognito/

    阅读:

    • 《使用 React Router 进行身份验证》:https://www.robinwieruch.de/react-router-authentication/


    测试

    现在最常见的 React 测试方案还是 Jest,它基本上提供了一个全面的测试框架所需要的一切。

    你可以使用 react-test-renderer 在你的 Jest 测试中渲染 React 组件。这已经足以使用 Jest 执行所谓的 Snapshot Tests 了:一旦运行测试,就会创建 React 组件中渲染的 DOM 元素的快照。当你在某个时间点再次运行测试时,将创建另一个快照,这个快照会和前一个快照进行 diff。如果存在差异,Jest 将发出警告,你要么接受这个快照,要么更改一下组件的实现。

    最近 React Testing Library (RTL) 也比较流行(在 Jest 测试环境中使用),它可以为 React 提供更精细的测试。RTL 支持让渲染组件模拟 HTML 元素上的事件成,配合 Jest 进行 DOM 节点的断言。

    如果你正在寻找用于 React 端到端 (E2E) 测试的测试工具,Cypress 是现在最受欢迎的选择。

    阅读:

    • 《React 单元测试实践》:https://zhuanlan.zhihu.com/p/431143598


    数据结构

    6ca7d7fe4ca3869890d17d13b307991e.png

    Vanilla JavaScript 为你提供了大量内置工具来处理数据结构,就好像它们是不可变的一样。但是,如果你觉得需要强制执行不可变数据结构,那么最受欢迎的选择之一是 Immer 。我个人没用过它,因为 JavaScript 本身就可以用于管理不可变的数据结构,但是如果有人专门问到 JS 的不可变性,有人会推荐它。

    链接:

    • Immer:https://github.com/immerjs/immer

    阅读:

    • 《immer —— 提高React开发效率的神器》https://zhuanlan.zhihu.com/p/146773995


    国际化

    f417203921e623df73271187154ac041.png

    当涉及到 React 应用程序的国际化 i18n 时,你不仅需要考虑翻译,还需要考虑复数、日期和货币的格式以及其他一些事情。这些是处理国际化的最流行的库:

    • FormatJS:https://github.com/formatjs/formatjs

    • react-i18next:https://github.com/i18next/react-i18next


    富文本编辑

    55cfcd9a7daf10db0b4f56b28dc9efa1.png

    React 中的富文本编辑器,就简单推荐下面几个,我也没太多用过:

    • Draft.js:https://draftjs.org/

    • Slate.js:https://www.slatejs.org/

    • ReactQuill:https://github.com/zenoamaro/react-quill


    时间处理

    ed335cc088644c7fae7f7fdfec1f8f7c.png

    近年来,JavaScript 本身在处理日期和时间方面做了很多优化和努力,所以一般没必要使用专门的库来处理它们。但是,如果你的 React 应用程序需要大量处理日期、时间和时区,你可以引入一个库来为你管理这些事情:

    • date-fns:https://github.com/date-fns/date-fns

    • Day.js:https://github.com/iamkun/dayjs

    • Luxon:https://github.com/moment/luxon/


    客户端

    fa4358d367fbcd3ee145f7b8eefea9b9.png

    Electron 是现在跨平台桌面应用程序的首选框架。但是,也存在一些替代方案:

    • Tauri:(当前最新的) https://github.com/tauri-apps/tauri

    • NW.js:https://nwjs.io/

    • Neutralino.js:https://github.com/neutralinojs/neutralinojs

    阅读:

    • 《扔掉 Electron,拥抱基于 Rust 开发的 Tauri》:https://juejin.cn/post/7067342513920540686#comment


    移动端

    adaeb64ce1af7da2ecd50e3cdf547976.png

    将 React 从 Web 带到移动设备的首选解决方案仍然是 React Native

    阅读:

    • 《React Native 新架构》:https://segmentfault.com/a/1190000041182593


    VR/AR

    9dd4ce33f6f1eedc8a52f0fc9402b9ad.png

    通过 React,我们也可以深入研究虚拟现实或增强现实。老实说,这些库我还都没用过,但它们是我在 React 中所熟悉的 AR/VR 库:

    • react-three-fiber:(最流行的3D库,其中也有VR实现)https://github.com/pmndrs/react-three-fiber

    • `react-360:https://facebook.github.io/react-360/

    • aframe-react:https://github.com/supermedium/aframe-react


    原型设计

    830ef7c24e15893fea8f443c14e51b2e.png

    如果你是一名 UI/UX 设计师,你可能希望使用一种工具来为新的 React 组件、布局或 UI/UX 概念进行快速原型设计。我之前用的是 Sketch ,现在改用了 Figma 。尽管我两者都喜欢,但我还是更喜欢 FigmaZeplin 是另一种选择。对于一些简单的草图,我喜欢使用 Excalidraw。如果你正在寻找交互式 UI/UX 设计,可以看看 InVision

    • Sketch:https://www.sketch.com/

    • Figma:https://www.figma.com/

    • Zeplin:https://zeplin.io/

    • Excalidraw:https://excalidraw.com/

    • InVision:https://www.invisionapp.com/


    文档

    87569250b99e481a245e76e2b2c7e671.png

    我在很多项目里都在使用 Storybook 作为文档工具,不过也有一些其他好的方案:

    • Docusaurus:https://github.com/facebook/docusaurus

    • Docz:https://github.com/doczjs/docz

    • Styleguidist:https://github.com/styleguidist/react-styleguidist

    最后

    参考:https://www.robinwieruch.de/react-libraries/

    本文完,欢迎大家补充。

    
     
    - 完 -
    推荐阅读

    彻底解决新手对 react 的恐惧!

    44道JS难题,做对一半就是高手

    86张脑图,一口气看完 React

    程序媛字节裸辞后,都干了些什么....

    最后

    我是小前端,欢迎大家围观我的朋友圈,搞搞技术,吹吹牛逼。我的微信:kujian89,秒添加,回复加群,可以进入 500人前端群。

    14223d6f7ff6872e5a892c14d2a0ac30.png

    关注公众号:前端开发博客

    1. 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF

    2. 回复「Vue脑图」获取 Vue 相关脑图

    3. 回复「思维图」获取 JavaScript 相关思维图

    4. 回复「简历」获取简历制作建议

    5. 回复「简历模板」获取精选的简历模板

    6. 回复「加群」进入500人前端精英群

    7. 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。

    8. 回复「知识点」下载高清JavaScript知识点图谱

     👍🏻 点赞 + 在看 支持小编

    展开全文
  • 2022 react native 面试题

    千次阅读 2022-03-27 23:27:15
    2022 react native 面试题

    以下答案为参考了一些资料并思考后汇总,还没想通的就没有写进来,如果有好的回答请在评论区留言~
    后续了解更多rn的知识后会补充以及更新

    1. react native中的ScrollView组件是什么

    ScrollView 组件是一个通用滚动容器,可以承载多个组件和视图。您可以垂直和水平滚动(通过设置 horizontal 属性)。ScrollView 还可用于在 IOS 中实现收缩和缩放功能。在视图之间水平滑动也可以使用 ViewPagerAndroid 组件在 Android 上实现。ScrollView 最适合呈现少量大小有限的内容。ScrollView 的所有元素和视图都将渲染,即使它们当前未显示在屏幕上也是如此。

    import React from 'react';
    import { View, Text, Image, ActivityIndicator, StyleSheet, ScrollView } from "react-native";
    
    const initialState = { pictures: [
    {id:0, download_url:"https://picsum.photos/id/0/5616/3744" },
    {id:1, download_url: "https://picsum.photos/id/1002/4312/2868"},
    {id:2, download_url: "https://picsum.photos/id/1006/3000/2000"},
    {id:3, download_url: "https://picsum.photos/id/1015/6000/4000"}
    ] };
    class PictureList extends React.Component {
        constructor(props) {
            super(props);
            this.state = initialState;
        }
       
        render() {
            const { pictures } = this.state;
            if (!pictures.length) { return (<ActivityIndicator />); }
            return (
                <View>
                    <ScrollView>
                      {pictures.map(picture => (
                        <View style={styles.container} key={picture.id}>
                            <Image style={styles.image} source={{uri: picture.download_url}} />
                        </View>
                      ))}  
                     />
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            borderColor: '#ccc',
            borderWidth: 1,
            borderRadius: 5,
            backgroundColor: '#eaf7fd',
            marginBottom: 15,
        },
        image: {
            margin: 5,
            borderRadius: 5,
            width: 300,
            height: 300,
        }
    });
    
    export default PictureList;
    

    上面的示例在 ScrollView 中呈现图像列表。我们从 react-native 库中导入 ScrollView 组件,并在 ScrollView 中创建了 Image 元素。每个 Image 元素都有自己的宽度和高度,通过 CSS 设置。当您运行上述代码并滚动屏幕时,您应该能够浏览所有图像渲染。滚动视图用于在移动应用程序上创建可滚动的 UI。它适用于IOS和Android。

    2. 什么是FlatList,相比于ScrollView有什么区别

    React native 提供了 FlatList 组件来显示长列表。

    FlatList 适用于长数据列表,其中项目数可能会随时间而变化,比如我们常见的滚动到底部加载更多。

    与适用更多场景的 ScrollView 不同,FlatList 只渲染屏幕上的可见元素,而不是列表中的所有元素。因此FlatList 比 ScrollView 性能更高,因为列表内的元素只有在进入屏幕可视区域时才会渲染,而ScrollView是全部渲染。

    3.如何在react native中发起api请求

    我们可以使用javascript的api > fetch来进行请求

    async function getPic(){
        const api = 'https://picsum.photos/v2/list';
        const fetchResponse = await fetch(api);
        // 拿到结果
        const pictures = await fetchResponse.json();
    }
    

    4. 什么是非受控组件和受控组件

    4.1 受控组件

    在 HTML 中,表单元素(如、 和 )通常自己维护 state,并根据用户输入进行更新。而在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。

    我们可以把两者结合起来,使 React 的 state 成为“唯一数据源”。渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”。

    4.2 非受控组件

    非受控组件将真实数据储存在 DOM 节点中,因此在使用非受控组件时,有时候反而更容易同时集成 React 和非 React 代码。如果你不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少你的代码量。否则,你应该使用受控组件。

    4.3 对比

    简而言之,组件的状态由可控的数据管理,则为受控组件,如果组件的状态没有可控的数据管理,则为非受控组件

    5. 说说你对高阶函数的理解

    高阶函数的基本定义是,如果函数接受一个函数作为参数或返回另一个函数,则该函数称为高阶函数。

    高阶函数的好处在于方便我们多次复用一部分代码来实现功能,我们也可以通过函数柯里化的方式来实现高阶函数,这里简单说下什么是函数柯里化(currying)
    让我举个例子:

    function multiplyBy(a) {
    	return function(b) {
    		return a * b;
    	};
    }
    

    此函数是高阶函数,因为它返回一个新函数。此函数将充当不同功能的函数生成器。例如,我可以使用上面的高阶函数创建一个计算双倍值的函数:

    const double = multiplyBy(2);
    console.log(double(4)) //result: 8
    

    类似地,我可以使用相同的高阶函数来生成一个三倍值函数,该函数将数字作为参数并返回三倍于数字。

    const triple = multiplyBy(3);
    console.log(triple(4)) //result: 12
    

    这种类型的函数生成在javascript中被称为柯里化(currying)。这是一种很不错的开发方式,因为这可以把基本逻辑和最终要实现的逻辑分离。基本逻辑可以在多个地方复用。

    6. react native中父子组件的通信如何进行

    7. 如何在react native中实现多个屏幕之间的跳转

    移动应用程序包含多个屏幕,并且必须有一种方法可以在应用程序中的多个屏幕中导航。管理多个屏幕的显示和之间的转换通常由所谓的导航器处理。React Navigation提供了一个易于使用的导航解决方案,能够在iOS和Android上呈现常见的堆栈导航和选项卡式导航模式。

    8. react native中的虚拟dom是如何运作的

    Virtual DOM由React核心团队成员Pete Hunt推广。React 通过使用这个术语来解释其性能方面。他们解释说,DOM操作始终是一个繁重的操作,因为浏览器重排,重绘事件由DOM操作触发。浏览器需要根据即将发生的更改重新计算元素的位置。为了优化此浏览器操作,ReactJS 尝试最大程度地减少 DOM 操作操作。React 创建一个内存中数据结构缓存,计算结果差异,然后有效地更新浏览器显示的 DOM。这允许开发人员编写代码,就好像每次更改时都会呈现整个页面一样,而 React 库仅呈现实际更改的子组件。这就是 React 通过将数据结构保留在内存中来增加空间复杂性的方式,但通过减少更新的 DOM 操作次数来降低处理成本,从而实现实际的 DOM。

    9. react native在项目较大时如何管理状态数据

    在 React 中,我们遵循组件驱动开发,这意味着我们将编写几个有状态或无状态的组件,并将它们组合在一起以构建整个应用程序。如果应用程序越来越大,那么在很多情况下,一个组件想要访问任何其他组件的状态。实现此目的的一种方法是将依赖组件作为同一父组件的子组件,然后可以通过回调进行通信。

    这些解决方案适用于小型应用程序,但对于大型应用程序,将回调从父元素传递到最里面的子元素很麻烦。这就是Redux的用武之地。Redux 是一个流行的库,用于有效地维护和管理大型 React 原生应用程序的状态。它提供了一个存储,该存储保持应用程序级状态,开发人员需要编写操作和化简器来修改存储中的状态。任何组件都可以通过使用 Redux 的高阶组件连接与商店连接。任何组件都可以调度一个操作,该操作到达化简器并更新存储中的状态。

    10. react native中如何实现过渡动画

    11. react native组件的key属性有什么用

    12. react native 和 react 是什么关系

    React:
    React 是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或者网页。
    React.js:
    在React框架之上,发展出了React.js 框架来开发网页。
    React Native:
    在React框架之上,发展出来React Native 用来开发移动应用。

    所以要写react native势必要先学会react的使用和理念

    13. react native是怎么做到将js输出成app的,又如何利用js调用ios/android的api

    bundle打包机制

    bridges

    JS Engine

    展开全文
  • React框架概述

    万次阅读 多人点赞 2022-03-01 22:42:57
    React框架概述1 React简介1.1 React概述1.2 React开发环境搭建1.3 第一个React应用1.4 React虚拟DOM1.5 ReactDOM.render()方法1.6 React的渲染机制1.7 React优势1.8 React脚手架2 React JSX2.1 JSX介绍2.2 JSX的应用...

    1 React简介

    1.1 React概述

    1. 是JavaScript的库,可以简化可视化界面的开发
    2. 是基于JSX语法(JavaScript Xml),JSX是React的核心组成部分,它使用xml标记的方式去直接声明界面,和html、js混写
    3. 核心是组件,将数据和逻辑进行封装。提高了代码复用率,降低了代码维护的难度。

    1.2 React开发环境搭建

    1、基本应用(传统应用):在页面文件中导入React的核心库(.js文件),可以引入官网上的地址,也可以自己下载之后本地引入。
    (1)核心库:react.development.js

    <!-- 官网地址 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 本地引入 -->
    <script src="../react的js库/react.development.js"></script>
    

    (2)与DOM相关的库:react-dom.development.js

    <!-- 官网地址 -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <!-- 本地引入 -->
    <script src="../react的js库/react-dom.development.js"></script>
    

    (3)babel编译器库:将ES6转换成ES5

    <!-- 官网地址 -->
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <!-- 本地引入 -->
    <script src="../react的js库/babel.min.js"></script>
    

    2、脚手架开发:搭建React项目,根据不同的需求开发组件
    (1)create-react-app:属于FacdBook,快速的、不做任何配置的构建React开发环境

    npm install -g create-react-app
    

    (2)create-react-app构建的react开发环境是基于webpack+ES6

    1.3 第一个React应用

    首先引入库文件:

        <script src="../react的js库/react.development.js"></script>
        <script src="../react的js库/react-dom.development.js"></script>
        <script src="../react的js库/babel.min.js"></script>
    

    在body标签中编写JavaScript代码:

        <div id="example"></div>
        <!-- 创建React虚拟DOM -->
        <script type="text/babel">
            ReactDOM.render(
                <h1>Hello World</h1>,
                document.getElementById("example")
            )
        </script>
    

    在这里插入图片描述

    1.4 React虚拟DOM

    React框架的核心优势之一, 就是支持创建虚拟DOM来提高页面性能。那么,什么是虚拟DOM呢?其实, 虚拟DOM这个概念很早就被提出来了, 是相对于实际DOM而言的。

    设计人员在设计传统HTML网页的UI时, 都会在页面中定义若干的DOM元素, 这些DOM元素是所谓的实际DOM。通常, 页面中的实际DOM负责承载着外观表现和数据变化,任何外观形式的改变或数据信息的更新都要反馈到UI上, 都是需要通过操作实际DOM来实现的。

    于是, 问题也就自然出现了。对于复杂的页面UI而言, 往往会定义大量的实际DOM。频繁地操作大量实际DOM往往会带来访问性能的严重下降, 用户体验也会随之变差, 这些都是设计人员所不希望看到的。因此, React框架专门针对这个现象引入了虚拟DOM机制,以避免频繁的DOM操作带来的性能下降问题。

    React DOM类似于一种将相关的实际DOM组合在一起的集合, 是React的虚拟DOM对象内置对象,将其理解为DOM组件应该更为贴切。因此,React框架将ReactDOM称为虚拟DOM。

    示例代码:传统的(实际)DOM

        <div id="app"></div>
        <script>
            // 获取页面中的div
            let div = document.getElementById("app");
            // 创建span标签
            let span = document.createElement("span");
            // 创建h3标签
            let h3 = document.createElement("h3");
            h3.innerHTML = "橘猫吃不胖";
            // 创建p标签
            let p = document.createElement("p");
            p.innerHTML = "新年快乐";
            // 将h3和p都添加到span中
            span.appendChild(h3);
            span.appendChild(p);
            // 将span添加到div中
            div.appendChild(span);
        </script>
    

    示例代码:虚拟DOM

        <div id="react-div"></div>
        <script type="text/babel">
            let reactDiv = document.getElementById("react-div");
            //创建虚拟的DOM元素
            //React.createElement中3个参数表示元素名字,空对象以及对象中的内容
            const reactH3 = React.createElement("h3", {}, "橘猫吃不胖");
            const reactP = React.createElement("p", {}, "新年快乐");
            const reactSpan = React.createElement("span", {}, reactH3, reactP);
            //将span渲染到div中去
            ReactDOM.render(reactSpan, reactDiv);
        </script>
    

    1.5 ReactDOM.render()方法

    render函数:渲染函数,将react的虚拟DOM元素渲染到页面中

    ReactDOM.render(element,container[,callback])
    

    element参数:必须,表示渲染的源对象(元素或组件)
    container参数:必须,表示渲染的目标对象(元素或组件)
    callback参数:可选,用于定义回调函数

    1.6 React的渲染机制

    React框架之所以大受欢迎, 其特有的渲染机制是非常重要的因素之一。既然提到React 渲染机制, 那么就说一说Diff算法, 该算法是支撑React渲染机制的核心技术之一。

    Diff算法的核心就是扫描DOM树,通过扫描找到DOM树前后的差异。若DOM树的状态或属性发生改变,React会构建新的DOM树,将新的DOM树和原来的DOM树进行比较,找到树中变化的部分进行修改。好处是避免重复的频繁的操作DOM,提高页面的访问性能。

    1.7 React优势

    声明式设计:React 采用声明范式,可以轻松描述应用。
    高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
    灵活:React可以与已知的库或框架很好地配合。
    使用JSX语法:JSX是JavaScript语法的扩展,可以极大地提高JS运行效率。
    组件复用:通过React构建组件使得代码易于复用,可在大型项目应用开发中发挥优势。
    单向响应的数据流:React实现了单向响应的数据流,减少了重复代码,比传统数据绑定方式更简单。

    1.8 React脚手架

    create-react-app 是来自于Facebook,通过该命令我们无需配置就能快速构建 React 开发环境。create-react-app 自动创建的项目是基于 Webpack + ES6 。

    安装create-react-app

    npm install -g create-react-app
    

    创建项目

    create-react-app my-app
    

    进入项目所在目录

    cd my-app
    

    启动项目

    npm start
    

    2 React JSX

    2.1 JSX介绍

    JSX是JavaScript XML的缩写,是JavaScript的语法的扩展,支持自定义属性,是react的内置的语法,其基本语法格式为

    const 元素名 = (
        <根标签名>
            <子标签></子标签>
        </根标签名>
    );
    

    注意:
    (1)创建元素时必须有一个根标签,该根标签是一个容器,里面可以包含其他的标签
    (2)在react的脚手架项目中可以使用空标签(<></>)作为根标签

    若要在React项目中使用JSX语法, 则必须引用“babel.js”来解析JSX,且在<script>标签中必须改用type="text/ babel"属性。原因是: 在使用type="text/babel"属性替换type="text/javascript属性后, 浏览器内置的JavaScript解释器就不会解析<script>标签里的脚本代码, 转而由“babel.js”进行解析, 从而避免React代码与原生JavaScript代码发生混淆。

    2.2 JSX的应用

    示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            const span = (
                <span>
                    <h3>React JSX</h3>
                    <p>通过jsx语法创建一个元素</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.3 JSX算数表达式

    在React JSX中使用JavaScript表达式要使用大括号”{ }”括起来,可以解析算术表达式。在{}中放算术表达式即可。

    示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            const span = (
                <span>
                    <h3>JSX算术表达式</h3>
                    <p>3+6 = {3 + 6}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.4 JSX条件表达式

    在React JSX中使用JavaScript表达式无法使用if条件语句,但是可以使用条件运算符构成
    条件表达式来替代if条件语句

    示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            const span = (
                <span>
                    <h3>JSX条件表达式</h3>
                    <p>1==1{1 == 1 ? "true" : "false"}</p>
                    <p>1!==1{1 !== 1 ? "true" : "false"}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.5 JSX嵌入表达式

    先定义一个变量,可以通过在JSX中引用该变量的方式使用该变量

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            let name = "橘猫吃不胖";
            const span = (
                <span>
                    <h3>JSX嵌入表达式</h3>
                    <p>用户名:{name}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.6 JSX对象表达式

    在{}中可以直接以“对象名.属性”方式访问对象

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            let user = {
                name: "橘猫吃不胖",
                age: 10
            }
            const span = (
                <span>
                    <h3>JSX对象表达式</h3>
                    <p>姓名:{user.name}</p>
                    <p>年龄:{user.age}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.7 JSX函数表达式

    可以通过函数的调用来实现对if的使用

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function userInfo() {
                return "橘猫吃不胖";
            }
            const span = (
                <span>
                    <h3>JSX函数表达式</h3>
                    <p>{userInfo()}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述
    JSX增强函数表达式:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function userInfo(msg) {
                if (msg) {
                    return msg;
                } else {
                    return "信息为空";
                }
            }
            const span = (
                <span>
                    <h3>JSX增强函数表达式</h3>
                    <p>{userInfo("橘猫吃不胖")}</p>
                    <p>{userInfo()}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.8 JSX数组表达式

    在数组中存放标签,在{}中解析数组

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            let arr = [
                <p>姓名:橘猫吃不胖</p>,
                <p>年龄:10</p>
            ]
            const span = (
                <span>
                    <h3>JSX数组表达式</h3>
                    <p>{arr}</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.9 JSX样式表达式

    将CSS样式应用到虚拟DOM中

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            let css1 = {
                color: "red"
            }
            let css2 = {
                color: "orange"
            }
            const span = (
                <span>
                    <h3>JSX样式表达式</h3>
                    <p style={css1}>AAAA</p>
                    <p style={css2}>BBBB</p>
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    2.10 JSX注释表达式

    在JSX元素中(虚拟DOM)中进行注释,使用的格式是{/*注释内容*/}

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            const span = (
                <span>
                    <h3>JSX注释表达式</h3>
                    {/*这是一行注释*/}
                </span>
            )
            // 将span添加到root中
            ReactDOM.render(span, root);
        </script>
    

    在这里插入图片描述

    3 React组件与Props

    3.1 React组件介绍

    React组件可以将UI切分成一些独立的、可复用的部件, 这样有助于设计人员专注于构建每一个单独的部件。React组件通过Props可以接收任意的输入值, 因此Props也可以理解为参数的概念。

    React语法是基于版本ECMAScript6实现的。因此,React组件除了通过JavaScript函数形式实现,还可以通过ES6 Class(类)的形式来实现。

    3.2 React函数组件

    函数组件是基于ES6的函数,是轻量级组件(不占用内存空间),React官方提倡使用。

    语法为:

    // 组件的名称的首字母必须要大写
    function Fun() {
        return (
            <标签></标签>
        )
    }
    

    使用函数组件时,要将函数名当做标签使用:

    <Fun />
    

    示例:在页面上输出Hello World!

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function SayHello() {
                return <p>Hello World!</p>
            }
            ReactDOM.render(<SayHello />, root);
        </script>
    

    在这里插入图片描述

    3.3 类组件

    语法为:

    class 类名 extends React.Component {
        render() {
            return <标签></标签>
        }
    }
    

    使用:将类名当做标签名使用

    <类名 />
    

    强调:无论是函数组件还是类组件,组件名的首字母必须大写

    类组件示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            class Hello extends React.Component {
                render() {
                    return <p>Hello~</p>
                }
            }
            ReactDOM.render(<Hello />, root);
        </script>
    

    在这里插入图片描述

    3.4 React组合组件

    示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            //创建函数组件
            function FormTitle() { // 标题组件
                return (
                    <h3>用户登录</h3>
                )
            }
            function UserId() {
                return UserId = (
                    <p>用户ID<input type="text" /></p>
                )
            }
            function UserName() {
                const userName = (
                    <p>用户名:<input type="text" /></p>
                )
                return userName;
            }
            function UserPwd() {
                const userPwd = (
                    <p>密码:<input type="password" /></p>
                )
                return userPwd;
            }
            function Submit() {
                return (
                    <button>登录</button>
                )
            }
            // 将函数组件组合成一个组件
            function FormLogin() {
                return (
                    <div>
                        <FormTitle />
                        <UserId />
                        <UserName />
                        <UserPwd />
                        <Submit />
                    </div>
                )
            }
            // 渲染
            ReactDOM.render(<FormLogin />, root);
        </script>
    

    在这里插入图片描述

    3.5 React Props介绍

    React框架定义了一个Props的概念, 专门用来实现React函数组件接收参数

    示例代码:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function Hello(props) {
                return <p>你好,{props.name}</p>
            }
            ReactDOM.render(<Hello name="橘猫吃不胖"/>, root);
        </script>
    

    示例:通过props初始化表单

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function UserId(props) {
                const userId = (
                    <p>用户名:<input type="text" value={props.userId} /></p>
                )
                return userId;
            }
            ReactDOM.render(<UserId userId="1001" />, root);
        </script>
    

    在这里插入图片描述
    注意:
    (1)在使用函数组件时无论是否传递参数,props属性都是默认存在
    (2)props的参数值是只读的,不能修改,因此上述示例中的input标签中的1001不可以修改
    (3)在类组件中可以使用props属性的defaultProps来设置组件的默认值(标签可以设置defaultValue属性,该属性的值可以是Props属性的值),具体方法为:

    类名.defaultProps = {
        属性名: 默认值
    }
    

    或者可以使用static来定义默认值,示例代码如下:

    static.defaultProps = {
        属性名: 默认值
    }
    

    (4)在函数组件中使用props属性的defaultProps来设置组件的默认值

    函数名.defaultProps = {
        属性名: 默认值
    }
    

    使用标签的defaultValue属性默认值就可以修改上面的input中的内容不可以修改的问题了,示例代码如下:

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            function UserId(props) {
                const userId = (
                    <p>用户名:<input type="text" defaultValue={props.userId} /></p>
                )
                return userId;
            }
            ReactDOM.render(<UserId userId="1001" />, root);
        </script>
    

    (5)可以通过Props对虚拟DOM中的标签属性进行类型、必要性的限制

    第一步:导入prop-types.js库文件:对props属性进行类型、必要性的检查

    <script src="../react的js库/prop-types.js"></script>
    

    第二步:通过PropTypes对标签属性进行限制

    第三步:在函数组件中进行类型检查

    函数名.propTypes = {
        属性名: PropTypes.类型名.必要性限制
    }			
    

    在类中进行类型检查步骤:①在类的内部使用static进行定义

    static propTypes = {
        属性名: PropTypes.类型名.必要性限制
    }
    

    ②在类的外部进行定义

    类名.propTypes = {
        属性名: PropTypes.类型名.必要性限制
    }		
    

    示例代码:在类中进行类型检查

        <div id="root"></div>
        <script type="text/babel">
            let root = document.getElementById("root");
            class PropsTest extends React.Component {
                static defaultProps = {
                    name: "张三",
                    age: 33,
                    address: "北京"
                }
                static propTypes = {
                    name: PropTypes.string.isRequired, // 表示name属性值必须是string类型,并且不能缺少
                    address: PropTypes.string,
                    age: PropTypes.number
                }
                constructor(props) {
                    super(props);
                }
                render() {
                    const { name, age, address } = this.props
                    return (
                        <div>
                            <label>用户名:
                                <input type="text" defaultValue={name} />
                            </label>
                            <br />
                            <label>年龄:
                                <input type="text" defaultValue={age} />
                            </label>
                            <br />
                            <label>用户名:
                                <input type="text" defaultValue={address} />
                            </label>
                            <br />
                        </div>
                    )
                }
            }
            ReactDOM.render(<PropsTest />, root)
        </script>
    

    在这里插入图片描述

    展开全文
  • React Native 的未来与React Hooks

    千次阅读 2019-04-15 09:19:37
    近期和一些朋友聊到了 React-Native 的官方重构状态,而刚好近期发布的 0.59.x 系列版本中,上层设计出现了比较大的调整,结合体验之后的状态,就想聊聊 React-Native 的现状、新版本的升级体验、还有新支持的 React...
  • React路由V6技术文档

    千次阅读 2022-04-01 13:49:44
    React Router 6 快速上手 1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件、钩子。 react-router-dom: 包含react-router所有内容,并添加一些...
  • React Router 6 (React路由) 最详细教程

    千次阅读 2022-03-29 02:21:40
    **React Router** 经历多个版本的发展,现在已经到了 **React Router 6**。虽然网络上写 React-Router 路由本身的教程很多,但真正讲到 React-Router 6 的并不多。同时因为第 6 版引入了很多新的概念,以及大量使用 ...
  • React.js是一个非常流行的前端框架,具有强大的社区,这意味着您可以找到很多项目作为示例。我们希望简化您的研究工作,因此在本文中,我们将介绍18个React.js项目,它们的复杂程度各不相同,并且可以用作新项目的...
  • React中使用react-websocket

    千次阅读 2022-03-25 10:06:52
    react-websocket 安装 npm install --save react-websocket 用法 importWebsocketfrom'react-websocket'; 这里引入的是根目录下index.jsx,如果需要引入js文件可以使用 import Websocket from 'react-...
  • 搭建完整react项目(React)

    千次阅读 2022-02-09 22:02:20
    一、创建 React 项目 create-react-app 项目名称 二、下载依赖包 1、下载路由 yarn add react-router-dom@5.3.0 npm i react-router-dom@5.3.0 2、下载状态机 3、下载 antd npm i antd yarn add antd 三、配置...
  • ReactNative常用插件使用

    千次阅读 2022-02-09 15:02:26
    目前使用的项目node版本v14.17.5, npm版本6.14.14, reactNative项目使用的模板结合typescript语法的项目模板架构,安装的方式如下: npx react-native init xxx(项目名) --template react-native-template-typescript...
  • React面试题(全家桶)

    千次阅读 多人点赞 2020-09-12 16:20:32
    创建react项目命令: npx create-react-app my-app 进入文件夹: cd my-app 启动项目: npm start(开发模式下运行) npm test(测试环境运行) npm run build(打包为生产模式) 显示配置文件:不可逆的,只要...
  • 2021年React常见的面试题以及答案(持续更新中...)

    万次阅读 多人点赞 2021-05-18 10:38:00
    React组件生命周期有几个阶段详细解释 React 组件的生命周期方法react在哪个生命周期做优化受控组件和非受控组件的区别为什么虚拟 dom 会提高性能react的diff算法是怎么完成的react组件之间如何通信什么是高阶组件?...
  • React 18 新特性

    千次阅读 2022-03-31 16:58:50
    这里介绍一下React18的4个新特性: Automatic batching Concurrent APIs SSR for Suspense New Render API Automatic bacthing 在 React 中使用setState来进行dispatch组件的State变化,当setState在组件中被调用...
  • react 中使用swiper

    千次阅读 2020-09-01 12:24:36
    本文是官网翻译:Swiper React Components 配置项含义可参考​​​​​​​ Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 安装 Swiper React 只能够通过 NPM 安装,作为Swiper 主库的一部分: npm i swiper 用法 ...
  • react-router v6 路由统一管理及路由拦截方案

    千次阅读 多人点赞 2022-01-07 10:38:33
    上一篇分享了react-router v5 版本的路由管理及拦截方案,但也存在一些缺陷,例如不支持嵌套路由、不支持动态路由参数等。 后来看到了react-router v6 版本useRoutes api 的特性,决定升级到v6版本,并对路由管理和...
  • React(四)React生命周期、发送网络请求、跨域处理

    万次阅读 多人点赞 2021-11-19 19:03:37
    React生命周期、发送网络请求获取网络数据、跨域的处理。
  • react-router-dom v6 使用

    万次阅读 多人点赞 2021-11-19 00:07:56
    react-router-dom react-router-dom v6 整体体验相对于 v5 ,体验要好更多,最大的一个改变,就是曾经的 Route 不可嵌套,整个路由配置必须拆分成若干小块,除非通过 react-router-config 这种插件,才可以实现对...
  • React hooks组件通信

    千次阅读 多人点赞 2022-07-26 09:32:27
    组件通信是React中的一个重要的知识点,下面列举一下reacthooks中常用的父子、跨组件通信的方法。
  • react18降低为react17

    千次阅读 2022-04-25 15:05:17
    react18降低为react17
  • React Native概述 React是一个构建用户界面的JS框架,实现了数据的响应式和组件化开发,本身既可以用于Web网站项目,也可以用于创建移动端App项目. 相较于Vue.js在移动端只能构建WebApp,React生态系统中有一个可以构建...
  • React(二)react脚手架的搭建

    万次阅读 多人点赞 2021-11-10 09:52:05
    React:脚手架项目的搭建与启动
  • 超详细的新手React入门教程

    千次阅读 2021-07-26 10:06:57
    React简介react是什么?为什么学?React入门React 基础案例JSX基础语法两种创建虚拟DOM的方式1.使用JSX创建虚拟DOM2.使用JS创建虚拟DOMjsx语法规则模块与组件、模块化与组件化的理解模块组件模块化组件化函数式组件...
  • react框架总结

    万次阅读 多人点赞 2018-11-23 14:15:31
    React.js的技术点总结
  • 开源插件,基于react-draggable插件(同一作者),详见《react-resizable》; // 拖拽回调参数 size:{width,height} type ResizeCallbackData = { node: HTMLElement, size: {width: number, height: number}, ...
  • [react] React中如何监听state的变化?

    千次阅读 2021-11-17 13:53:01
    [react] React中如何监听state的变化? 16.x 之前使用componentWillReveiveProps componentWillReceiveProps (nextProps){ if(this.props.visible !== nextProps.visible){ //props 值改变做的事 } } 2.16.x 之后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 624,849
精华内容 249,939
关键字:

react