React常見面試題詳解

一、React 生命周期

1、生命周期簡介

React 生命周期是指 React 組件從實例創建到銷毀的整個過程。其中包含掛載、更新和卸載三個階段。

2、生命周期分類

React 生命周期可以分為三類:Mounting, Updating, Unmounting。其中 Mounting 指組件加載到 DOM 上,Update 指組件數據改變引起的重新渲染,Unmounting 指組件卸載銷毀時。

3、常用生命周期

componentDidMount():組件掛載時調用,可以進行 AJAX 請求和 DOM 操作等。

componentDidUpdate():組件更新時調用,可以進行更新操作。

componentWillUnmount():組件卸載時調用,可以進行一些清理操作。

二、React 的虛擬 DOM

1、什麼是虛擬 DOM

虛擬 DOM 是簡化版的 DOM,是 React 中組件狀態改變後重新渲染組件的關鍵技術。虛擬 DOM 通過一系列的比較和更新操作,儘可能地減少與真實 DOM 的交互,從而提高頁面渲染效率。

2、虛擬 DOM 的優點

(1)提高頁面渲染效率,避免了每次修改都涉及到真實 DOM 的操作;

(2)簡化了操作,提升了開發效率;

(3)實現了 diff 算法,可以最小化更新 DOM,從而提高了頁面性能。

三、React 組件間通信

1、組件間通信方式

(1)props 靜態方式:通過 props 把數據從父組件傳遞到子組件。

(2)context 跨級方式:通過 context 屬性可以在組件樹中直接傳遞數據,跨級傳遞更加便捷。

(3)自定義事件方式:通過自定義事件向祖先或子孫組件傳遞信息。

2、props 與 state 的區別

(1)props 是父組件向子組件傳遞的數據;state 是組件自己的狀態數據。

(2)props 是只讀的,不允許子組件修改;state 可以由組件自己修改,但需要通過 setState() 方法改變。

四、React 高階組件(HOC)

1、高階組件簡介

高階組件是指將一個組件作為參數,並返回一個新組件的函數。

2、高階組件的作用

(1)代碼復用:將多個組件公用的邏輯抽取成一個高階組件,避免代碼冗餘;

(2)擴展組件功能:將某個組件需要的功能通過高階組件注入的方式進行擴展;

(3)渲染劫持:在不修改組件本身的前提下對組件進行渲染控制。

3、高階組件示例代碼:

  // HOC
  const withLoginStatus = (WrappedComponent) => {
    return class extends React.Component {
      constructor(props) {
        super(props);
        this.state = { isLoggedIn: false };
      }
      componentDidMount() {
        this.setState({ isLoggedIn: true });
      }
      render() {
        const { isLoggedIn } = this.state;
        return ;
      }
    }
  }
  // 組件
  const MyComponent = ({ isLoggedIn }) => (
    

{isLoggedIn ? '您已登錄' : '請登錄'}

); // 使用 const WrappedComponent = withLoginStatus(MyComponent); ReactDOM.render(, document.getElementById('app'));

五、React 的性能優化

1、虛擬 DOM 優化

(1)減少不必要的渲染:通過 shouldComponentUpdate() 方法來控制是否需要重新渲染組件。

(2)合理使用 React.Fragment:減少多餘的 DOM 包裹標籤。

(3)使用 key 屬性:相同的 key 值可以減少虛擬 DOM 比對時的計算量。

2、其他性能優化

(1)使用 React 生產環境構建:生產環境構建時可以去除開發環境下的調試代碼和警告信息。

(2)避免過量渲染:儘可能減少 DOM 操作次數。

(3)優化 JavaScript 代碼:避免使用循環嵌套等性能開銷大的操作。

代碼示例:

  class MyComponent extends React.Component {
    shouldComponentUpdate(nextProps, nextState) {
      if (this.props.text === nextProps.text && this.state.count === nextState.count) {
        return false;
      }
      return true;
    }
    render() {
      return (
        <React.Fragment>
          <span key="text">{this.props.text}</span>
          <button key="btn">{this.state.count}</button>
        </React.Fragment>
      );
    }
  }

六、Redux 與 React 結合

1、Redux 基本用法

(1)Action:定義數據操作的類型。

(2)Reducer:定義數據操作,並返回操作後的新數據。

(3)Store:用於管理應用的 State。

2、Redux 與 React 結合示例代碼:

  // Action
  const ADD_TODO = 'ADD_TODO';
  const REMOVE_TODO = 'REMOVE_TODO';

  // Action Creator
  const addTodo = (text) => ({
    type: ADD_TODO,
    payload: {
      text,
    },
  });

  const removeTodo = (id) => ({
    type: REMOVE_TODO,
    payload: {
      id,
    },
  });

  // Reducer
  const todos = (state = [], action) => {
    switch (action.type) {
      case ADD_TODO:
        return [...state, action.payload.text];
      case REMOVE_TODO:
        return state.filter((item, index) => index !== action.payload.id);
      default:
        return state;
    }
  };

  // Store
  const store = createStore(todos);

  // React 組件
  const TodoList = ({ todos }) => (
    <ul>
      {todos.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );

  class TodoApp extends React.Component {
    constructor(props) {
      super(props);
      this.state = { todos: store.getState() };
      this.handleAdd = this.handleAdd.bind(this);
      this.handleRemove = this.handleRemove.bind(this);
    }
    componentDidMount() {
      this.unsubscribe = store.subscribe(() => {
        this.setState({ todos: store.getState() });
      });
    }
    componentWillUnmount() {
      this.unsubscribe();
    }
    handleAdd() {
      const text = prompt('請輸入待辦事項');
      if (text) {
        store.dispatch(addTodo(text));
      }
    }
    handleRemove(index) {
      store.dispatch(removeTodo(index));
    }
    render() {
      const { todos } = this.state;
      return (
        <React.Fragment>
          <TodoList todos={todos} />
          <button onClick={this.handleAdd}>新增</button>
        </React.Fragment>
      );
    }
  }

  ReactDOM.render(<TodoApp />, document.getElementById('app'));

原創文章,作者:WDYUO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/335042.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WDYUO的頭像WDYUO
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相關推薦

  • @uiw/react-amap介紹

    本文將詳細闡述@uiw/react-amap的使用方法和參數配置,以及如何在React應用中集成高德地圖組件。 一、@uiw/react-amap簡介 @uiw/react-ama…

    編程 2025-04-29
  • Webrtc音視頻開發React+Flutter+Go實戰PDF

    本文將從多個方面介紹如何使用React、Flutter和Go來進行Webrtc音視頻開發,並提供相應的代碼示例。 一、Webrtc音視頻開發介紹 Webrtc是Google開發的一…

    編程 2025-04-27
  • Python常見異常類型解析

    本文將闡述Python常見異常類型,包括其定義、分類及處理方法。 一、語法錯誤 語法錯誤是指在Python代碼編寫過程中出現的錯誤,這是一種最常見的錯誤類型。當Python解釋器無…

    編程 2025-04-27
  • React簡書項目

    本文將從以下幾個方面介紹React簡書項目: 項目概述 組件分析 路由配置 Redux狀態管理 項目優化 一、項目概述 React簡書項目是一個類似於博客的Web應用,提供用戶撰寫…

    編程 2025-04-27
  • 源碼審計面試題用法介紹

    在進行源碼審計面試時,可能會遇到各種類型的問題,本文將以實例為基礎,從多個方面對源碼審計面試題進行詳細闡述。 一、SQL注入 SQL注入是常見的一種攻擊方式,攻擊者通過在輸入的參數…

    編程 2025-04-27
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論