);
}
}
什么是上下文
有时我们必须将props
传递给组件树,即使所有中间组件都不需要这些props
。上下文是一种传递props
的方法,而不用在每一层传递组件树。
什么是 Hooks
Hooks 是React版本16.8中的新功能。 请记住,我们不能在函数组件中使用state
,因为它们不是类组件。Hooks 让我们在函数组件中可以使用state 和其他功能。
目前没有重大变化,我们不必放弃类组件。
Hook 不会影响你对 React 概念的理解。 恰恰相反,Hook 为已知的 React 概念提供了更直接的 API:props, state,context,refs 以及生命周期。稍后我们将看到,Hook 还提供了一种更强大的方式来组合他们。
我们可以使用一些钩子,例如useState,useEffect,useContext,useReducer等。
下面是 Hooks 的基本规则
- Hooks 应该在外层使用,不应该在循环,条件或嵌套函数中使用
- Hooks 应该只在函数组件中使用。
让我们看一个例子来理解 hooks。 这是一个函数组件,它采用props
并在UI上显示这些props
。 在useState
钩子的帮助下,我们将这个函数组件转换为有状态组件。 首先,我们在第5行定义状态,这相当于
constructor(props) {
super(props);
this.state = {
name:'myname', age:10, address:'0000 one street'
}
}
useState
返回两个项,一个是user
,另一个是setUser
函数。 user
是一个可以在没有 this
关键字的情况下直接使用的对象,setUser
是一个可以用来设置用户点击第21
行按钮的状态的函数,该函数等效于以下内容。
this.setState({name:'name changed'})
import React, { useState } from "react";
export const UserDisplay = ({ name, address, age }) => {
const [user, setUser] = useState({
name: "myname",
age: 10,
address: "0000 onestreet"
});
return (
<>
<div>
<div class="label">Name:</div>
<div>{user.name}</div>
</div>
<div>
<div class="label">Address:</div>
<div>{user.address}</div>
</div>
<div>
<div class="label">Age:</div>
<div>{user.age}</div>
</div>
<button onClick={() => setUser({ name: "name changed" })}>
Click me
</button>
</>
);
};
如何提高性能
我们可以通过多种方式提高应用性能,以下这些比较重要:
- 适当地使用
shouldComponentUpdate
生命周期方法。 它避免了子组件的不必要的渲染。 如果树中有100个组件,则不重新渲染整个组件树来提高应用程序性能。
- 使用
create-react-app
来构建项目,这会创建整个项目结构,并进行大量优化。
- 不可变性是提高性能的关键。不要对数据进行修改,而是始终在现有集合的基础上创建新的集合,以保持尽可能少的复制,从而提高性能。
- 在显示列表或表格时始终使用
Keys
,这会让 React 的更新速度更快
- 代码分离是将代码插入到单独的文件中,只加载模块或部分所需的文件的技术。
如何在重新加载页面时保留数据
单页应用程序首先在DOM中加载index.html
,然后在用户浏览页面时加载内容,或者从同一index.html
中的后端API获取任何数据。
如果通过点击浏览器中的重新加载按钮重新加载页面index.html
,整个React应用程序将重新加载,我们将丢失应用程序的状态。 如何保留应用状态?
每当重新加载应用程序时,我们使用浏览器localstorage
来保存应用程序的状态。我们将整个存储数据保存在localstorage
中,每当有页面刷新或重新加载时,我们从localstorage
加载状态。
如何在React进行API调用
我们使用redux-thunk
在React中调用API。因为reduce
是纯函数,所以没有副作用,比如调用API。
因此,我们必须使用redux-thunk
从 action creators 那里进行 API 调用。Action creator 派发一个action,将来自API的数据放入action 的 payload
中。Reducers 接收我们在上面的redux
循环中讨论的数据,其余的过程也是相同的。
redux-thunk是一个中间件。一旦它被引入到项目中,每次派发一个action
时,都会通过thunk
传递。如果它是一个函数,它只是等待函数处理并返回响应。如果它不是一个函数,它只是正常处理。
这里有一个例子。sendEmailAPI
是从组件中调用的函数,它接受一个数据并返回一个函数,其中dispatch
作为参数。我们使用redux-thunk
调用API apiservice
,并等待收到响应。一旦接收到响应,我们就使用payload
派发一个action
。
import apiservice from '../services/apiservice';
export function sendEmail(data) {
return { type:"SEND_EMAIL", payload: data };
}
export function sendEmailAPI(email) {
return function(dispatch) {
return apiservice.callAPI(email).then(data => {
dispatch(sendEmail(data));
});
}
}
总结
要想有把握的面试,必须充分了解上述所有主题。 即使你目前正在使用React,理解这些概念也能增强你在职场中信心。