继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

React+TS教程:从零开始的React与TypeScript入门指南

吃鸡游戏
关注TA
已关注
手记 485
粉丝 55
获赞 339

本文详细介绍了React和TypeScript的基础知识和集成方法,包括React组件的创建、TypeScript的基本语法以及如何在React项目中引入和配置TypeScript。文章还提供了丰富的示例代码和项目实践,帮助读者理解和掌握React+TS教程中的关键概念和技巧。

React基础入门
什么是React及其核心概念

React 是一个由 Facebook 开发并维护的 JavaScript 库,主要用于构建用户界面。它通过组件化开发方式,将复杂的用户界面分解成多个可复用的组件。React 的主要优势在于其高效的渲染和更新机制,以及强大的社区支持。

以下是 React 的一些核心概念:

  • 组件:React 应用通常由多个组件构成。组件是可复用的代码块,可以独立地管理和更新自身的状态。组件可以嵌套以构建复杂的界面。

  • 虚拟DOM:React 使用虚拟DOM来提高渲染性能。组件的渲染会生成一个虚拟的DOM树,然后比较虚拟DOM与实际DOM之间的差异,并将更改最小化地应用到实际DOM上。

  • 状态(State):组件的状态是指组件内部的数据。状态的变化会导致组件的重新渲染。

  • 属性(Props):属性是组件从父组件到子组件的数据传递方式。父组件可以将数据作为属性传递给子组件。

  • 生命周期:React 组件在其生命周期的不同阶段有不同的方法可以使用。例如,componentDidMountcomponentWillUnmount 分别对应组件挂载后和卸载前的执行。

创建第一个React应用

要创建一个React应用,可以使用 Create React App 作为起点。这将帮助你快速搭建一个React应用的开发环境。

  1. 安装 Node.js 和 npm。
  2. 安装 Create React App:
npx create-react-app my-app
  1. 进入项目目录并启动开发服务器:
cd my-app
npm start

上述命令会启动开发服务器,并在浏览器中打开应用。浏览器默认会打开 http://localhost:3000

示例:创建一个简单的React组件

在项目中可以创建一个简单的React组件,例如 App.js 文件:

// src/App.js
import React from 'react';

function App() {
  return (
    <div>
      <h1>Hello, React!</h1>
    </div>
  );
}

export default App;

安装和配置React开发环境

为了开发React应用,你需要安装和配置以下工具:

  • Node.js
  • npm 或 yarn(用于包管理)
  • Create React App(用于快速搭建项目)

以下是具体的安装步骤:

  1. 安装 Node.js 和 npm
# 查看当前 Node.js 版本
node -v

# 安装 Node.js
https://nodejs.org/
  1. 安装 yarn(可选):
npm install -g yarn
  1. 使用 Create React App 创建项目
npx create-react-app my-app
  1. 启动开发服务器
cd my-app
npm start

一个简单的项目结构如下:

my-app/
├── node_modules/
├── public/
│   └── index.html
├── src/
│   ├── App.js
│   ├── index.js
│   └── ...
├── package.json
└── ...
TypeScript基础入门
什么是TypeScript及其优势

TypeScript 是由 Microsoft 开发的 JavaScript 的超集,它在 JavaScript 的基础上增加了一些静态类型检查的功能。TypeScript 的主要优势包括:

  • 静态类型检查:在编译时可以发现类型错误。
  • 代码维护性:明确的类型定义使得代码更易于理解和维护。
  • 工具支持:IDE 支持,如代码补全、重构等。
  • 跨平台:TypeScript 可以编译成 JavaScript,可以在任何支持 JavaScript 的平台上运行。

安装和配置TypeScript

为了开始使用 TypeScript,你需要安装 TypeScript 并配置开发环境。

  1. 安装 TypeScript
npm install -g typescript
  1. 创建 TypeScript 项目
mkdir my-typescript-app
cd my-typescript-app
npm init -y
  1. 安装 TypeScript 并初始化
npm install typescript --save-dev
npx tsc --init
  1. 编写和编译 TypeScript 代码

在项目根目录下创建一个 src 文件夹,并在 src 文件夹下创建一个 index.ts 文件:

// src/index.ts
function add(a: number, b: number): number {
  return a + b;
}

console.log(add(10, 20));

编译 TypeScript 代码:

npx tsc

编译后的 JavaScript 文件将被输出到 dist 文件夹中。

基本语法和数据类型

TypeScript 提供了多种数据类型,包括:

  • number
  • string
  • boolean
  • any
  • undefined
  • null
  • void
  • never
  • object
  • symbol
  • bigint

以下是 TypeScript 中基本数据类型的示例:

let age: number = 25;
let name: string = "张三";
let isAdult: boolean = true;

let anyType: any = "字符串";
anyType = 123;

let undef: undefined = undefined;
let nullType: null = null;

function print(): void {
  console.log("这是一个没有返回值的函数");
}

function neverReturn(): never {
  throw new Error("Error");
}
React与TypeScript集成
在React项目中引入TypeScript

要在 React 项目中引入 TypeScript,需要进行以下步骤:

  1. 安装 TypeScript 和 React 类型定义文件
npm install typescript @types/react @types/react-dom --save-dev
  1. 配置 TypeScript

创建 tsconfig.json 文件,配置 TypeScript 编译选项:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true
  },
  "include": ["src/**/*.ts", "src/**/*.tsx"],
  "exclude": ["node_modules", "build"]
}
  1. 编写 TypeScript 代码

例如,创建一个简单的组件文件 src/App.tsx

// src/App.tsx
import React from 'react';

interface Props {
  name: string;
}

const Greeting: React.FC<Props> = (props) => {
  return (
    <div>
      <h1>Hello, {props.name}!</h1>
    </div>
  );
};

export default Greeting;
定义React组件的TypeScript类型

在 React 项目中,可以通过定义组件的类型来确保组件的属性和状态的类型一致性。

定义组件属性类型

可以通过接口或类型别名定义组件的属性类型:

interface Props {
  name: string;
  age: number;
}

const UserProfile: React.FC<Props> = (props) => {
  return (
    <div>
      <h1>User Profile</h1>
      <h2>Name: {props.name}</h2>
      <h2>Age: {props.age}</h2>
    </div>
  );
};

定义组件状态类型

组件状态通常在组件内部定义,可以使用接口或类型别名来定义状态的类型:

interface State {
  count: number;
}

class Counter extends React.Component<{}, State> {
  constructor(props: {}) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Increment
        </button>
      </div>
    );
  }
}
使用TypeScript进行状态管理和props传递

在 React 中,使用 TypeScript 可以更好地管理组件的状态和属性传递。

使用 Context 进行状态管理

Context 是 React 中用于在组件树中传递状态的一种方式。使用 TypeScript 定义 Context 类型:

import React, { createContext, useState } from 'react';

interface Theme {
  theme: string;
}

const ThemeContext = React.createContext<Theme | undefined>(undefined);

const ThemeProvider: React.FC = ({ children }) => {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext.Provider value={{ theme: theme }}>
      {children}
    </ThemeContext.Provider>
  );
};

const useTheme = () => {
  const context = React.useContext(ThemeContext);
  if (context === undefined) {
    throw new Error('useTheme must be used within a ThemeProvider');
  }
  return context;
};

export { ThemeProvider, useTheme };

使用 Props 进行组件状态传递

Props 用于在父组件和子组件之间传递状态。使用 TypeScript 定义 Props 类型:

interface Props {
  initialCount: number;
  onCountChange: (count: number) => void;
}

const Counter: React.FC<Props> = ({ initialCount, onCountChange }) => {
  const [count, setCount] = React.useState(initialCount);

  const increment = () => {
    setCount(count + 1);
    onCountChange(count + 1);
  };

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
    </div>
  );
};
React组件开发指南
类组件和函数组件的区别

React 组件有两种主要形式:类组件(Class Component)和函数组件(Functional Component)。以下是它们的主要区别:

  • 类组件
    • 使用 class 关键字定义。
    • 可以使用生命周期方法。
    • 可以有状态(state)和生命周期方法。
    • 示例:
import React, { Component } from 'react';

interface State {
  count: number;
}

class Counter extends Component<{}, State> {
  constructor(props: {}) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}
  • 函数组件
    • 使用函数定义。
    • 没有状态或生命周期方法。
    • 示例:
import React from 'react';

const Counter: React.FC = () => {
  const [count, setCount] = React.useState(0);
  const increment = () => setCount(count + 1);

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
    </div>
  );
};
组件的生命周期

React 的组件生命周期分为以下阶段:

  • 挂载阶段

    • constructor:初始化状态和属性。
    • static getDerivedStateFromProps:在组件初始化和每次更新时调用。
    • render:渲染组件。
    • componentDidMount:组件挂载后的初始化操作。
  • 更新阶段

    • static getDerivedStateFromProps:在组件初始化和每次更新时调用。
    • shouldComponentUpdate:判断组件是否需要更新。
    • render:渲染组件。
    • getSnapshotBeforeUpdate:在组件更新之前执行。
    • componentDidUpdate:组件更新后的操作。
  • 卸载阶段
    • componentWillUnmount:在组件卸载前执行清理操作。

示例:组件生命周期方法

以下是一个示例组件,展示了生命周期方法的使用:

class LifecycleExample extends React.Component<{}, {}> {
  constructor(props: {}) {
    super(props);
    console.log('Constructor');
  }

  static getDerivedStateFromProps(props: {}, state: {}) {
    console.log('getDerivedStateFromProps');
    return null;
  }

  componentDidMount() {
    console.log('componentDidMount');
  }

  shouldComponentUpdate(nextProps: {}, nextState: {}) {
    console.log('shouldComponentUpdate');
    return true;
  }

  getSnapshotBeforeUpdate(prevProps: {}, prevState: {}) {
    console.log('getSnapshotBeforeUpdate');
    return null;
  }

  componentDidUpdate(prevProps: {}, prevState: {}) {
    console.log('componentDidUpdate');
  }

  componentWillUnmount() {
    console.log('componentWillUnmount');
  }

  render() {
    console.log('render');
    return <div>Hello, Lifecycle!</div>;
  }
}
高阶组件和Hook的使用

高阶组件(Higher-Order Component, HOC)是一种模式,通过包裹组件来复用代码逻辑。通常用于抽象业务逻辑,如权限控制、数据获取等。

示例:高阶组件

定义一个高阶组件,用于为需要登录的组件添加登录状态检查:

const withAuth = (WrappedComponent: React.ComponentType) => {
  return class extends React.Component {
    render() {
      if (this.isLoggedIn()) {
        return <WrappedComponent {...this.props} />;
      }
      return <div>Please log in</div>;
    }

    isLoggedIn() {
      // 模拟登录检查逻辑
      return true;
    }
  };
};

const LoggedIn = () => <div>You are logged in</div>;

const AuthenticatedComponent = withAuth(LoggedIn);

Hooks

Hooks 是 React 16.8 引入的新特性,使得函数组件可以拥有生命周期方法和状态。常见的 Hooks 包括 useStateuseEffectuseContextuseReducer 等。

示例:使用 Hooks

以下是一个使用 useStateuseEffect 的示例:

import React, { useState, useEffect } from 'react';

const Counter: React.FC = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('Count updated:', count);
  }, [count]);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
    </div>
  );
};
项目实践与调试技巧
创建一个简单的Todo应用

以下是一个简单的 Todo 应用的完整代码。应用包含添加、删除和编辑任务的功能。

项目结构

src/
├── App.tsx
├── components/
│   ├── TodoItem.tsx
│   └── TodoForm.tsx
└── index.tsx

编写代码

index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

App.tsx

import React from 'react';
import TodoForm from './components/TodoForm';
import TodoItem from './components/TodoItem';
import './App.css';

interface Todo {
  id: number;
  text: string;
  completed: boolean;
}

interface State {
  todos: Todo[];
}

class App extends React.Component<{}, State> {
  constructor(props: {}) {
    super(props);
    this.state = {
      todos: [],
    };
  }

  addTodo = (text: string) => {
    const newTodo = {
      id: Date.now(),
      text,
      completed: false,
    };
    this.setState((prev) => ({
      todos: [...prev.todos, newTodo],
    }));
  };

  toggleComplete = (id: number) => {
    this.setState((prev) => ({
      todos: prev.todos.map((todo) =>
        todo.id === id ? { ...todo, completed: !todo.completed } : todo
      ),
    }));
  };

  deleteTodo = (id: number) => {
    this.setState((prev) => ({
      todos: prev.todos.filter((todo) => todo.id !== id),
    }));
  };

  render() {
    return (
      <div className="App">
        <TodoForm addTodo={this.addTodo} />
        {this.state.todos.map((todo) => (
          <TodoItem
            key={todo.id}
            todo={todo}
            toggleComplete={this.toggleComplete}
            deleteTodo={this.deleteTodo}
          />
        ))}
      </div>
    );
  }
}

export default App;

TodoForm.tsx

import React from 'react';

interface Props {
  addTodo: (text: string) => void;
}

const TodoForm: React.FC<Props> = ({ addTodo }) => {
  const [text, setText] = React.useState('');

  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    addTodo(text);
    setText('');
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={text}
        onChange={(e) => setText(e.target.value)}
      />
      <button type="submit">Add Todo</button>
    </form>
  );
};

export default TodoForm;

TodoItem.tsx

import React from 'react';

interface Props {
  todo: Todo;
  toggleComplete: (id: number) => void;
  deleteTodo: (id: number) => void;
}

const TodoItem: React.FC<Props> = ({ todo, toggleComplete, deleteTodo }) => {
  return (
    <div>
      <input
        type="checkbox"
        checked={todo.completed}
        onChange={() => toggleComplete(todo.id)}
      />
      <span onClick={() => toggleComplete(todo.id)}>
        {todo.text}
      </span>
      <button onClick={() => deleteTodo(todo.id)}>Delete</button>
    </div>
  );
};

export default TodoItem;

编译并运行

使用 TypeScript 编译项目:

npx tsc

运行项目:

npm start
调试React和TypeScript应用

使用浏览器开发者工具

  1. 打开浏览器的开发者工具(通常按 F12 或右键选择“检查”)。
  2. 查看控制台输出,查看错误信息和日志。
  3. 查看 Elements 标签页,查看 DOM 结构。
  4. 查看 Sources 标签页,查看源代码和断点。

使用React DevTools

React DevTools 是一个专门用于调试 React 应用的 Chrome 扩展。它可以帮助你查看组件树、状态、属性等信息。

  1. 安装 React DevTools 扩展。
  2. 在开发者工具中打开 React DevTools。
  3. 使用它来查看和调试组件。

示例:设置断点和查看状态

在 Sources 标签页中设置断点,例如在 App.tsxrender 方法中设置断点,以便在组件渲染时触发断点。

使用ESLint和Prettier进行代码格式化

ESLint 和 Prettier 是两个常用的工具,用于代码质量检查和格式化。

安装和配置 ESLint

  1. 安装 ESLint 和相关依赖:
npm install eslint eslint-plugin-react eslint-plugin-react-hooks --save-dev
  1. 初始化 ESLint 配置:
npx eslint --init
  1. 配置 ESLint 规则,例如在 .eslintrc.json 中:
{
  "env": {
    "browser": true,
    "es6": true
  },
  "extends": "react-app",
  "parser": "@typescript-eslint/parser",
  "plugins": ["react", "react-hooks"],
  "rules": {
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn"
  }
}

安装和配置 Prettier

  1. 安装 Prettier:
npm install prettier --save-dev
  1. 初始化 Prettier 配置:
npx prettier --write .
  1. 配置 Prettier,例如在 .prettierrc.json 中:
{
  "singleQuote": true,
  "trailingComma": "all",
  "printWidth": 80,
  "tabWidth": 2
}

运行 ESLint 和 Prettier

可以在 package.json 中添加以下脚本:

{
  "scripts": {
    "lint": "eslint .",
    "format": "prettier --write ."
  }
}

使用以下命令运行:

npm run lint
npm run format
总结与后续学习建议
React+TypeScript常见问题解答
  • Q:React 和 TypeScript 之间有哪些主要区别?

    • React 是一个用于构建用户界面的 JavaScript 库,而 TypeScript 是 JavaScript 的超集,增加了静态类型检查和类型定义。
  • Q:如何解决类型错误?

    • 使用 strict 模式来启用严格的类型检查。确保类型定义正确,使用 strictNullChecks 以避免 null 和 undefined 的问题。
  • Q:如何在 VSCode 中使用 TypeScript?
    • 安装 VSCode 插件 TypeScriptTypeScript Extension Pack。配置 tsconfig.json 和项目文件,使用 TypeScript 的类型提示和代码补全功能。
推荐的学习资源和社区
  • 慕课网
    • 提供大量的 React 和 TypeScript 相关课程,适合不同水平的学习者。
  • React 官方文档
    • 提供详细的指南和示例,适合深入学习 React。
  • TypeScript 官方文档
    • 提供 TypeScript 的详细语法和最佳实践,适合深入学习 TypeScript。
  • GitHub 社区
    • 在 GitHub 上可以找到 React 和 TypeScript 的示例项目和问题解答,适合与其他开发者交流和学习。
持续学习和提升的建议
  • 项目实践
    • 通过实际项目来加深理解和应用所学知识。
  • 阅读源码
    • 阅读 React 和 TypeScript 的源码,了解内部实现和设计模式。
  • 社区贡献
    • 参与开源项目或社区,贡献代码和文档,提高自己的技术水平。
  • 持续学习
    • 保持对新技术和最佳实践的关注,定期阅读相关书籍和文章。
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP