MST

星途 面试题库

面试题:TypeScript装饰器在React组件状态管理中的应用

假设你正在使用React构建一个待办事项列表应用,需要管理列表项的添加、删除和完成状态。请使用TypeScript装饰器来封装状态管理逻辑,使得代码结构更清晰,可维护性更高。描述实现思路并给出关键代码片段,同时说明装饰器如何与React的状态和生命周期机制协同工作。
28.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义装饰器:使用TypeScript装饰器语法创建一个装饰器函数,该函数接收目标类和属性名作为参数。
  2. 状态管理逻辑封装:在装饰器内部,通过闭包的方式管理待办事项列表的状态,包括列表项的数组、添加、删除和更新完成状态的方法。
  3. 与React协同工作:装饰器返回一个新的类,这个类可以作为React组件的基类或者混入到React组件类中。利用React的状态和生命周期机制,在合适的时机调用装饰器封装的方法来更新状态,触发组件重新渲染。

关键代码片段

// 定义装饰器
function todoListState<T extends new (...args: any[]) => {}>(BaseComponent: T) {
    return class extends BaseComponent {
        // 待办事项列表状态
        private todoList: { id: number; text: string; completed: boolean }[] = [];
        private nextId = 1;

        // 添加待办事项方法
        addTodo = (text: string) => {
            this.todoList.push({ id: this.nextId++, text, completed: false });
            // 这里假设存在触发React组件重新渲染的逻辑,如setState等
        };

        // 删除待办事项方法
        deleteTodo = (id: number) => {
            this.todoList = this.todoList.filter(todo => todo.id!== id);
            // 这里假设存在触发React组件重新渲染的逻辑,如setState等
        };

        // 更新待办事项完成状态方法
        toggleTodo = (id: number) => {
            this.todoList = this.todoList.map(todo =>
                todo.id === id ? { ...todo, completed: !todo.completed } : todo
            );
            // 这里假设存在触发React组件重新渲染的逻辑,如setState等
        };
    };
}

// 使用装饰器
@todoListState
class TodoList extends React.Component {
    // React组件的其他方法和逻辑
    render() {
        return (
            // 渲染待办事项列表的JSX代码
        );
    }
}

装饰器与React的状态和生命周期机制协同工作说明

  1. 状态管理:装饰器内部管理的todoList等状态,类似于React组件的内部状态。当调用装饰器封装的addTododeleteTodotoggleTodo方法时,会更新这些状态。
  2. 重新渲染:在实际的React应用中,需要将装饰器中的状态更新与React的setState或者useState等状态更新机制结合,以触发组件重新渲染。例如,可以在装饰器的方法内部调用this.setState(如果是类组件)或者使用dispatch(如果使用Redux等状态管理库),使得组件能够根据新的状态重新渲染视图,展示最新的待办事项列表。
  3. 生命周期:React组件的生命周期方法(如componentDidMountcomponentDidUpdate等)可以与装饰器协同工作。例如,在componentDidMount中可以初始化一些数据,在componentDidUpdate中可以根据状态变化执行一些副作用操作,而这些状态变化可能是由装饰器封装的方法触发的。