387 - 《那些老派的 React 面试题》

发布于 2023年12月17日

来自付费课程 React of Joy 其中一节的整理。

这些问题完全过时,但你搜「React 面试问题」却经常能搜到。由于面试官或者他的题库比较「老派」,所以作为面试者,通常也不得不准备这些问题。

1、Presentational 和 Container 组件有啥区别?

2015 年,Dan Abramov 写了篇博客叫《Presentational and Container Components》。文章建议了一种设计模式,把组件分为两类:Presentational 和 Container。前者是纯组件,基于 props 渲染界面;后者用于管理 Presentational 组件的状态和逻辑。

比如这样。

function Counter({ count, increment }) {
  return <button onClick={increment}> Current count: {count} </button>;
}
function CounterContainer() {
  const [count, setCount] = React.useState(0);
  function increment() {
    setCount(count + 1);
  }
  return <Counter count={count} increment={increment} />;
}
export default CounterContainer;

现在这种模式已很少有人提及,创建者 Dan Abramov 也不再推荐。取而代之的方法是:将复杂的业务逻辑移到自定义 Hooks 里。

2、什么是高阶组件?

高阶组件简称「HOC」。他是一个函数,接受一个组件并将其包装在一个新的内部组件中。

比如。

function withUser(WrappedComponent) {
  return (props) => {
    const { data } = useSWR("/api/user", fetcher);
    return <WrappedComponent user={data} {...props} />;
  };
}

withUser 函数接受一个输入组件,并生成一种方法,用于渲染该输入组件,并「锁定」部分属性。

然后就可以这样。

const DashboardWithUser = withUser(Dashboard);
// We then render this element:
<DashboardWithUser />

HOC 的目的通常是为了在多个组件之间共享逻辑。在 hooks 出现之前,没有更好的方法可以在组件之间共享逻辑,所以我们不得不搞一些有创意的事情。hooks 出现之后就可以用自定义 Hook 的方式来解这个问题了,比如构建一个 useUser 的 Hook。

function useUser() {
  const { data } = useSWR("/api/user", fetcher);
  return data;
}

3、请列举 𝑛 个生命周期方法。

React 组件在过去是 JavaScript Class。

class Button extends React.Component {
  state = { count: 0 };
  handleClick = () => {
    console.log("Clicked!");
    this.setState({ count: this.state.count + 1 });
  };
  rend

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。