复习react

92 阅读3分钟

前言

最近也是很焦虑,大环境这么差。本着保持自己的竞争力,很有必要技多不压身。这不就想到了react.很久没有使用react了,一直在写vue。得复习复习。

搭一个react的项目

  1. 首先,使用以下命令创建项目:
yarn create vite vite-react-app --template react-ts
  1. 进入项目目录
cd my-react-app
  1. 安装依赖
yarn install
  1. 启动
yarn run

默认已经配置好的功能

  • Typescript 支持
  • React 18
  • ESLint 配置

基础概念

  1. JSX语法
// JSX 示例
const element = (
    <div className="greeting">
        <h1>Hello, World!</h1>
    </div>
);
  1. 组件(Components)
// 函数组件
function Welcome(props: { name: string }) {
    return <h1>Hello, {props.name}</h1>;
}

// 类组件
class Welcome extends React.Component<{ name: string }> {
    render() {
        return <h1>Hello, {this.props.name}</h1>;
    }
}

  1. Props和State
// Props 示例
function Welcome(props: { name: string }) {
    return <h1>Hello, {props.name}</h1>;
}

// State 示例(使用 Hooks)
function Counter() {
    const [count, setCount] = useState(0);
    
    return (
        <div>
            <p>Count: {count}</p>
            <button onClick={() => setCount(count + 1)}>
                增加
            </button>
        </div>
    );
}

React Hooks

  1. useState - 状态管理
function Example() {
    const [count, setCount] = useState(0);
    return (
        <div>
            <p>你点击了 {count} 次</p>
            <button onClick={() => setCount(count + 1)}>
                点击我
            </button>
        </div>
    );
}
  1. useEffect - 副作用处理
function Example() {
    const [data, setData] = useState(null);

    useEffect(() => {
        // 组件挂载时获取数据
        fetchData().then(result => setData(result));
        
        // 清理函数
        return () => {
            // 组件卸载时执行清理
        };
    }, []); // 空依赖数组表示只在挂载时执行

    return <div>{/* 渲染数据 */}</div>;
}

1. 创建一个React组件

// 最简单的函数组件
function Welcome() {
    return <h1>Hello, React!</h1>;
}

// 使用组件
function App() {
    return (
        <div>
            <Welcome />
        </div>
    );
}

2. Props(属性)

Props 允许我们向组件传递数据

// 定义具有 props 的组件
function Welcome(props: { name: string }) {
    return <h1>Hello, {props.name}!</h1>;
}

// 使用组件并传递 props
function App() {
    return (
        <div>
            <Welcome name="小明" />
            <Welcome name="小红" />
        </div>
    );
}

3. State(状态)和事件处理

import { useState } from 'react';

function Counter() {
    // 声明一个状态变量 count,初始值为 0
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>你点击了 {count} 次</p>
            <button onClick={() => setCount(count + 1)}>
                点击我
            </button>
        </div>
    );
}

写一个待办事项

import { useState } from 'react';

// 定义待办事项的类型
interface Todo {
    id: number;
    text: string;
    completed: boolean;
}

function TodoApp() {
    // 状态:待办事项列表
    const [todos, setTodos] = useState<Todo[]>([]);
    // 状态:输入框的值
    const [inputText, setInputText] = useState('');

    // 添加待办事项
    const handleAdd = () => {
        if (inputText.trim()) {
            const newTodo: Todo = {
                id: Date.now(),
                text: inputText.trim(),
                completed: false
            };
            setTodos([...todos, newTodo]);
            setInputText(''); // 清空输入框
        }
    };

    // 切换待办事项的完成状态
    const toggleTodo = (id: number) => {
        setTodos(todos.map(todo => 
            todo.id === id 
                ? { ...todo, completed: !todo.completed }
                : todo
        ));
    };

    // 删除待办事项
    const deleteTodo = (id: number) => {
        setTodos(todos.filter(todo => todo.id !== id));
    };

    return (
        <div>
            <h1>待办事项</h1>
            
            {/* 输入区域 */}
            <div>
                <input 
                    type="text"
                    value={inputText}
                    onChange={(e) => setInputText(e.target.value)}
                    placeholder="输入新的待办事项"
                />
                <button onClick={handleAdd}>添加</button>
            </div>

            {/* 待办事项列表 */}
            <ul>
                {todos.map(todo => (
                    <li key={todo.id}>
                        <span
                            onClick={() => toggleTodo(todo.id)}
                            style={{
                                textDecoration: todo.completed ? 'line-through' : 'none',
                                cursor: 'pointer'
                            }}
                        >
                            {todo.text}
                        </span>
                        <button onClick={() => deleteTodo(todo.id)}>
                            删除
                        </button>
                    </li>
                ))}
            </ul>
        </div>
    );
}

export default TodoApp;

集合

我全放在app.tsx里面了

import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'

function Welcome(props: {name: string}) {
  return <h1>Hello, {props.name}!</h1>
}

function Counter() {
  const [count, setCount] = useState(0)
  return (
    <div>
      <p>你点击了{count}次</p>
      <button onClick={() => setCount(count +1)}>点击我</button>
    </div>
  )
}

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

function TodoApp() {
  // 状态: 带办事项列表
  const [todos, setTodos] = useState<Todo[]>([]);
  // 状态: 输入框的值
  const [inputText, setInputText] = useState('');

  // 添加待办事项
  const handleAdd = () => {
    if(inputText.trim()) {
      const newTodo: Todo = {
        id: Date.now(),
        text: inputText.trim(),
        completed: false
      };
      setTodos([...todos, newTodo]);
      setInputText('')
    }
  }
  // 切换待办事项的完成状态
  const toggleTodo = (id: number) => {
    setTodos(todos.map(todo => todo.id === id ? {...todo, completed: !todo.completed} : todo))
  };
  // 删除待办事项
  const deleteTodo = (id: number) => {
    setTodos(todos.filter(todo => todo.id !== id))
  };
  return (
    <div>
      <h1>待办事项</h1>
      {/* 输入区域 */}
      <div>
        <input type="text" value={inputText} onChange={(e) => setInputText(e.target.value)} placeholder="输入新的待办事项" />
        <button onClick={handleAdd}>添加</button>
      </div>
      {/* 待办事项列表 */}
      <ul>
        {todos.map(todo => (
          <li key={todo.id}>
            <span onClick={() => toggleTodo(todo.id)} style={{textDecoration: todo.completed ? 'line-through' : 'none', cursor: 'pointer'}}>{ todo.text }</span>
            <button onClick={() => deleteTodo(todo.id)}>删除</button>
          </li>
        ))}
      </ul>
    </div>
  )
}

function App() {
  return (
    <>
      <div>
        <a href="https://vite.dev" target="_blank">
          <img src={viteLogo} className="logo" alt="Vite logo" />
        </a>
        <a href="https://react.dev" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
      </div>
      <Welcome name='他们叫我秃子' />
      <Counter />
      <TodoApp />
    </>
  )
}

export default App

记忆这个东西,如果不时常回忆一下,就会被放在深处