成为高级 React 开发你需要知道的知识点

14 篇文章 0 订阅
13 篇文章 0 订阅

简评:除了常见的 HOC 和 RenderProp 技巧,作者介绍了 7 个有用的知识点。

使用 Fragment 而不是 div

很多时候我们想要处理多个 component,但是 render 只允许返回一个 component,为了处理这个问题很可以使用

标签来包装所有的 component 。但这会添加额外的 HTML 元素。所以官方的建议是推荐使用 React Fragments 来处理这个问题。

import React, { Fragment } from 'react';
function ListItem({ item }) {
  return (
    
    <Fragment>
      <dt>{item.term}</dt>
      <dd>{item.description}</dd>
    </Fragment>

    // 也可以使用 <>....</> 来替换 <Fragment>    // 等同于    // <>    //  <dt>{item.term}</dt>    //  <dd>{item.description}</dd>    // </>   
  );}
function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        <ListItem item={item} key={item.id} />
      ))}
    </dl>
  );}

context 用起来

Context 提供了一种方式将数据传递到整个 component 树中,而不必手动为每一层 component 传递 props。

因此,如果你有多个需要值的 component,建议使用 context。如果只有一个子 component 需要使用这个值建议使用 compositions。

最少使用一个 Error Boundaries

React 16 附带了一个惊艳的功能 Error Boundaries。使用 Error Boundaries 我们可以处理这种问题,子组件出现错误不会导致整个应用报错和白屏。

举个例子: 定义一个 ErrorBoundary 组件

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.    return { hasError: true };
  }componentDidCatch(error, info) {
    // You can also log the error to an error reporting service    logErrorToMyService(error, info);
  }render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI      return `<h1>Something went wrong.</h1>;`
    }return this.props.children; 
  }}

用法和其他组件一样简单:

<ErrorBoundary>
  <MyWidget /></ErrorBoundary>

注意:React15 中的 unstable_handleError 方法不再有效,需要替换成 componentDidCatch 方法。

在生产环境中使用 production build

官网提供了很多提高性能的 配置。只需要 10 分钟即可给你的应用带来质的飞跃,在部署到生产环境前别忘了检查它们。

使用 Refs 来操纵元素

我们可以使用 Refs 来触发动画,文本选择或焦点管理。

例如:
我们可以 获取 inpout DOM 节点引用。

class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    // Create a ref to store the textInput DOM element
    this.textInput = React.createRef();
  }
  render() {
  // Use the `ref` callback to store a reference to the text input DOM
  // element in an instance field (for example, this.textInput).
    return (
      <input
        type="text"
        ref={this.textInput}
      />
    );
  }
}

然后就可以在合适的时机聚焦这个

focus() {
  // Explicitly focus the text input using the raw DOM API
  // Note: we're accessing "current" to get the DOM node
  this.textInput.current.focus();
}

使用代码拆分

如果你使用 create-react-app 创建应用或使用 NextJs 会自动创建一个 webpack 配置文件,webpack 会将整个应用打包到一个文件中,如果应用程序变得复杂或者添加第三方库都会导致最终生成的文件变大,导致应用访问速度变慢。这时候可以使用代码拆分,创建多个输出,在需要的时候才加载对应的包,可以大大改善网页加载时间。

可以使用 React.lazy 来实现代码拆分。

使用方式也很简单,这里简单实现一个基于路由代码分割的例子:

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';import React, { Suspense, lazy } from 'react';const Home = lazy(() => import('./routes/Home'));const About = lazy(() => import('./routes/About'));const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Switch>
        <Route exact path="/" component={Home}/>
        <Route path="/about" component={About}/>
      </Switch>
    </Suspense>
  </Router>);

注意: React.lazy 和 Suspense 暂不支持服务端渲染,如果服务端渲染想要实现这个功能可以使用 React
Loadable。

静态类型检查

JavaScript 不会对类型进行检查,这可能导致很多的问题。可以使用类型检查器(例如 Flow)来帮助我们提前发现错误。Flow 是有 facebook 开发的类型检查器,可以给变量、函数和 React Component 添加而外的注释是一个不错的选择。

原文:Concepts to become an advanced React developer

好的,我可以使用 React 脚手架来编写一个简单的 To-Do List 应用程序。首先,我需要运行以下命令来创建一个新的 React 应用程序: ``` npx create-react-app todo-list ``` 这将创建一个名为 "todo-list" 的新项目,并生成一些默认的 React 代码和文件。 接下来,我需要对应用程序进行一些修改,以便它可以实现 To-Do List 的功能。我需要创建一个新的组件,用于渲染 Todo List,以及一个用于渲染单个 Todo 的子组件。 在 `src` 文件夹下创建一个名为 `Todo.js` 的文件,其中包含以下代码: ```jsx import React from 'react'; const Todo = ({ todo }) => { return ( <div> {todo.text} </div> ); } export default Todo; ``` 这个组件接收一个名为 `todo` 的属性,该属性包含一个 Todo 对象,并将其渲染为一个简单的 `<div>` 元素。 接下来,我需要修改 `App.js` 文件,以便它可以渲染 To-Do List 和单个 Todo 组件。在 `App.js` 文件中,我需要创建一个名为 `todos` 的状态,它将包含一个 Todo 对象数组。然后,我需要使用 `map()` 方法将每个 Todo 对象映射到一个 `<Todo>` 组件上,并将其渲染到页面上。 ```jsx import React, { useState } from 'react'; import Todo from './Todo'; function App() { const [todos, setTodos] = useState([ { text: 'Learn React' }, { text: 'Build a To-Do List' }, { text: 'Deploy the App' }, ]); return ( <div> {todos.map((todo, index) => ( <Todo key={index} todo={todo} /> ))} </div> ); } export default App; ``` 在这个代码中,我使用 `useState()` 钩子来创建一个名为 `todos` 的状态,并初始化它为包含三个 Todo 对象的数组。然后,我使用 `map()` 方法将每个 Todo 对象映射到一个 `<Todo>` 组件上,并使用 `key` 属性来确保每个组件都有一个唯一的标识符。 最后,我需要在页面上添加一些输入框和按钮,以便用户可以添加新的 Todo。我将创建一个名为 `AddTodo` 的组件,它将包含一个文本输入框和一个“添加”按钮。当用户点击“添加”按钮时,它将调用一个名为 `addTodo` 的函数,该函数将新的 Todo 对象添加到 `todos` 状态中。 ```jsx import React, { useState } from 'react'; import Todo from './Todo'; function App() { const [todos, setTodos] = useState([ { text: 'Learn React' }, { text: 'Build a To-Do List' }, { text: 'Deploy the App' }, ]); const addTodo = (event) => { event.preventDefault(); const text = event.target.elements.todo.value; const newTodo = { text }; setTodos([...todos, newTodo]); event.target.elements.todo.value = ''; } return ( <div> {todos.map((todo, index) => ( <Todo key={index} todo={todo} /> ))} <form onSubmit={addTodo}> <input type="text" name="todo" /> <button type="submit">Add Todo</button> </form> </div> ); } export default App; ``` 在这个代码中,我创建了一个名为 `addTodo` 的函数,它将从输入框中获取文本,并将其添加到 `todos` 状态中。然后,我将在页面上添加一个表单,它将包含一个文本输入框和一个“添加”按钮,并使用 `onSubmit` 属性来调用 `addTodo` 函数。 这个简单的 To-Do List 应用程序涵盖了一些常见的 React 知识点,包括: - 使用 `create-react-app` 脚手架创建新的 React 应用程序 - 使用状态和钩子来管理应用程序状态 - 创建和使用 React 组件 - 使用 `map()` 方法在列表中渲染组件 - 处理表单输入并调用函数来更新状态 当然,这只是 React 生态系统的冰山一角,但这个简单的示例应该可以帮助你开始了解 React 的基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值