当前位置: 首页 > news >正文

怎样制作购物网站 微信转发免费正规的接单平台

怎样制作购物网站 微信转发,免费正规的接单平台,自己做h5怎么做,北京城乡建设委官方网站目录 一、环境与项目配置 1. 创建 TypeScript React 项目 2. 关键tsconfig.json配置 3.安装核心类型包 二、组件类型定义 1. 函数组件(React 18) 2.类组件 三、Hooks 的深度类型集成 1. useState 2. useEffect 3. useRef 4. 自定义 Hook 四、事…

目录

一、环境与项目配置

1. 创建 TypeScript React 项目

2. 关键tsconfig.json配置

3.安装核心类型包

二、组件类型定义

 1. 函数组件(React 18+)

2.类组件

三、Hooks 的深度类型集成

 1. useState

 2. useEffect

 3. useRef

4. 自定义 Hook

四、事件处理

1. 表单事件

2. 鼠标/键盘事件

五、状态管理(Redux Toolkit)

1.定义类型化的 Slice

2. 类型化的useSelector和useDispatch(组件中使用)

六、路由(React Router v6)

七、类型扩展与最佳实践

1. 扩展全局类型

2. 组件默认 Props

3. 泛型组件

4.高阶组件(HOC)类型

5.Context API类型安全

八、测试与调试

1. Jest + Testing Library

2.类型安全的Mock数据

九、常见问题

1. 如何处理第三方库类型?

2.处理动态导入(Lazy Loading )

3. 类型断言的使用

3. 处理可选 Props

4、性能优化

1.使用react.memo 优化渲染

2.类型化的useCallback和useMemo

十一、学习资源


一、环境与项目配置

1. 创建 TypeScript React 项目

# 使用 Create React App(推荐)

npx create-react-app my-app --template typescript

# 或使用 Vite(更轻量)

npm create vite@latest my-react-app -- --template react-ts
2. 关键tsconfig.json配置
{"compilerOptions": {"target": "ESNext","lib": ["DOM", "DOM.Iterable", "ESNext"], // 浏览器环境支持"jsx": "react-jsx",                      // React 17+ 的 JSX 转换"strict": true,                          // 启用所有严格类型检查"esModuleInterop": true,                  // 兼容 CommonJS/ES6 模块"skipLibCheck": true,                     // 跳过第三方库类型检查(提升速度)"forceConsistentCasingInFileNames": true, // 强制文件名大小写一致"baseUrl": "./src",                       // 路径别名基础目录"paths": {"@components/*": ["components/*"]       // 路径别名配置}},"include": ["src/**/*"]
}
3.安装核心类型包
npm install @types/react @types/react-dom @types/node --save-dev

二、组件类型定义

 1. 函数组件(React 18+)
// Button.tsx
import React from 'react';// 定义 Props 类型
interface ButtonProps {children: React.ReactNode;onClick: () => void;variant?: 'primary' | 'secondary';//可选属性disabled?: boolean;//可选回调函数
}//使用React.FC 泛型定义组件( React 18 后 FC 不再隐式包含 children)
const Button: React.FC<ButtonProps> = ({ children, onClick, variant = 'primary', //默认值disabled = false 
}) => {return (<button className={`btn-${variant}`}onClick={onClick}disabled={disabled}>{children}</button>);
};export default Button;
2.类组件
// Counter.tsx
import React from 'react';//State和Props类型定义
interface CounterProps {initialCount?: number;
}interface CounterState {count: number;
}class Counter extends React.Component<CounterProps, CounterState> {// 默认 Propsstatic defaultProps: Partial<CounterProps> = {initialCount: 0};// 初始化 State(需明确类型)state: CounterState = {count: this.props.initialCount!};// 箭头函数绑定 this(避免手动 bind)increment = () => {this.setState((prev) => ({ count: prev.count + 1 }));};render() {return (<div><p>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button></div>);}
}

三、Hooks 的深度类型集成

 1. useState
//react
//const [count, setCount] = React.useState<number>(0); // 显式指定类型
//const [user, setUser] = React.useState<User | null>(null); // 联合类型// 基础类型推断
const [count, setCount] = useState<number>(0);// 复杂对象类型(明确初始值)
interface User {id: string;name: string;email?: string;
}const [user, setUser] = useState<User>({id: '1',name: 'Alice'
});
 2. useEffect
// 异步请求的类型安全处理
useEffect(() => {let isMounted = true; // 防止组件卸载后更新状态const fetchData = async () => {try {const response = await fetch('/api/users');const data: User[] = await response.json();if (isMounted) setUsers(data);} catch (error) {console.error('Fetch error:', error);}};fetchData();return () => {isMounted = false;};
}, []);
 3. useRef
// DOM 引用
const inputRef = useRef<HTMLInputElement>(null);
// 可变值(非 DOM)
// 引用 DOM 元素
const inputRef = useRef<HTMLInputElement>(null);// 存储可变值(非 DOM)
interface Timer {id: number;start: () => void;
}const timerRef = useRef<Timer | null>(null);
4. 自定义 Hook
// useLocalStorage.ts
import { useState, useEffect } from 'react';function useLocalStorage<T>(key: string,initialValue: T
): [T, (value: T) => void] {const [storedValue, setStoredValue] = useState<T>(() => {try {const item = window.localStorage.getItem(key);return item ? JSON.parse(item) : initialValue;} catch (error) {return initialValue;}});const setValue = (value: T) => {try {setStoredValue(value);window.localStorage.setItem(key, JSON.stringify(value));} catch (error) {console.error('LocalStorage set error:', error);}};useEffect(() => {const handleStorageChange = (e: StorageEvent) => {if (e.key === key) {setStoredValue(JSON.parse(e.newValue!));}};window.addEventListener('storage', handleStorageChange);return () => window.removeEventListener('storage', handleStorageChange);}, [key]);return [storedValue, setValue];
}// 使用
const [theme, setTheme] = useLocalStorage<'light' | 'dark'>('theme', 'light');

四、事件处理

1. 表单事件
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {e.preventDefault();// 访问表单元素const input = e.currentTarget.elements.namedItem('username') as HTMLInputElement;console.log(input.value);
};
2. 鼠标/键盘事件
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {console.log(e.clientX, e.clientY);
};
const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {if (e.key === 'Enter') {// 处理回车}
};

五、状态管理(Redux Toolkit)

1.定义类型化的 Slice
// features/counter/counterSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';interface Todo {id:string;text: string ;value: number;
}
interface TodosState {list: Todo[];status: 'idle' | 'loading' | 'succeeded' | 'failef';const initialState: TodosState = {list: [];status: 'idle'
};const counterSlice = createSlice({name: 'tods',initialState,reducers: {addTodo: (state, action: PayloadAction<{ text: string }>) => {const newTodo: Todo = {id: Date.now().toString(),text: action.payload.text,completed: false};state.list.push(newTodo);},toggleTodo: (state, action: PayloadAction<string>) => {const todo = state.list.find(t => t.id === action.payload);if (todo) todo.completed = !todo.completed;}},extraReducers: (builder) => {// 异步处理示例builder.addCase(fetchTodos.pending, (state) => {state.status = 'loading';}).addCase(fetchTodos.fulfilled, (state, action: PayloadAction<Todo[]>) => {state.status = 'succeeded';state.list = action.payload;});}
});export const {addTodo, toggleTodo} = counterSlice.actions;
export default todoSlice.reducer;
2. 类型化的useSelector和useDispatch(组件中使用)
// Counter.tsx
import { useDispatch, useSelector } from 'react-redux';
import type { RootState } from '@/app/store';
import { increment } from '@/features/counter/counterSlice';const Counter = () => {const count = useSelector((state: RootState) => state.counter.value);const dispatch = useDispatch();return (<div><span>{count}</span><button onClick={() => dispatch(increment())}>+1</button></div>);
};

六、路由(React Router v6)

// App.tsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';interface RouteConfig {path: string;element: React.ReactNode;
}const routes: RouteConfig[] = [{ path: '/', element: <HomePage /> },{ path: '/about', element: <AboutPage /> }
];const App = () => (<BrowserRouter><Routes>{routes.map((route) => (<Route key={route.path} {...route} />))}</Routes></BrowserRouter>
);

七、类型扩展与最佳实践

1. 扩展全局类型
// react-app-env.d.ts
declare namespace React {interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {// 扩展自定义属性customAttr?: string;}
}
2. 组件默认 Props
interface Props {size?: 'small' | 'medium' | 'large';
}const MyComponent = ({ size = 'medium' }: Props) => {// ...
};
3. 泛型组件
interface ListProps<T> {items: T[];renderItem: (item: T) => React.ReactNode;
}
function List<T>({ items, renderItem }: ListProps<T>) {return (<div>{items.map((item, index) => (<div key={index}>{renderItem(item)}</div>))}</div>);
}// 使用
<List<{ id: string; name: string }> items={users}renderItem={(user) => <span>{user.name}</span>}
/>
4.高阶组件(HOC)类型
type WithLoadingProps = {isLoading: boolean;
};// 高阶组件:为组件添加 loading 状态
function withLoading<T extends object>(WrappedComponent: React.ComponentType<T>
) {return (props: T & WithLoadingProps) => {if (props.isLoading) return <div>Loading...</div>;return <WrappedComponent {...props} />;};
}// 使用
const UserListWithLoading = withLoading(UserList);
<UserListWithLoading isLoading={true} users={[]} />;
5.Context API类型安全
// ThemeContext.tsx
import React, { createContext, useContext } from 'react';type Theme = 'light' | 'dark';
type ThemeContextType = {theme: Theme;toggleTheme: () => void;
};const ThemeContext = createContext<ThemeContextType | undefined>(undefined);export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {const [theme, setTheme] = useState<Theme>('light');const toggleTheme = () => {setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));};return (<ThemeContext.Provider value={{ theme, toggleTheme }}>{children}</ThemeContext.Provider>);
};// 自定义 Hook 确保 Context 存在
export const useTheme = () => {const context = useContext(ThemeContext);if (!context) throw new Error('useTheme must be used within ThemeProvider');return context;
};

八、测试与调试

1. Jest + Testing Library
// Button.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';test('handles click event', () => {const handleClick = jest.fn();render(<Button onClick={handleClick}>Click Me</Button>);fireEvent.click(screen.getByText(/click me/i));expect(handleClick).toHaveBeenCalledTimes(1);
});// 测试异步操作
test('loads user data', async () => {render(<UserProfile userId="1" />);await waitFor(() => {expect(screen.getByText('Alice')).toBeInTheDocument();});
});
2.类型安全的Mock数据
// mocks/user.ts
import { User } from '../types';export const mockUser: User = {id: '1',name: 'Alice',email: 'alice@example.com'
};// 测试中使用
jest.mock('../api', () => ({fetchUser: jest.fn().mockResolvedValue(mockUser)
}));

九、常见问题

1. 如何处理第三方库类型?
npm install @types/react-router-dom @types/lodash # 安装类型声明# 安装社区维护的类型包
npm install @types/lodash @types/react-select --save-dev# 临时忽略类型检查(不推荐)
// @ts-ignore
import untypedLib from 'untyped-lib';
2.处理动态导入(Lazy Loading )
// 明确组件类型
const LazyComponent = React.lazy(() => import('./LazyComponent'));// 使用 Suspense
<Suspense fallback={<div>Loading...</div>}><LazyComponent />
</Suspense>
3. 类型断言的使用
//例a
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {const value = e.target.value as string; // 明确类型//例b 
const element = document.getElementById('root') as HTMLElement; // 安全断言
const data = response as ApiResponse; // 明确知道类型时
3. 处理可选 Props
interface AvatarProps {src: string;alt?: string; // 可选属性size?: number;
}const Avatar = ({ src, alt = '', size = 40 }: AvatarProps) => (<img src={src} alt={alt} width={size} />
);
4、性能优化
1.使用react.memo 优化渲染
interface MemoizedComponentProps {data: string[];
}const MemoizedComponent = React.memo<MemoizedComponentProps>(({ data }) => {// 复杂计算return <div>{data.join(', ')}</div>;
});
2.类型化的useCallback和useMemo
const memoizedCallback = useCallback((id: string) => {console.log('Callback called with:', id);},[] // 依赖项数组
);const memoizedValue = useMemo(() => {return computeExpensiveValue(a, b);
}, [a, b]); // 依赖项变化时重新计算

十一、学习资源

  1. React TypeScript Cheatsheet

  2. DefinitelyTyped(第三方库类型)

  3. TypeScript 官方文档

码字不易,各位大佬点点赞呗

http://www.hrbkazy.com/news/17313.html

相关文章:

  • 保定 网站建设抖音推广运营公司
  • 网站片头怎么做网站权重如何查询
  • 网站开发工作内容推广专家
  • 高大上网站友情链接检测工具
  • 广州门户网站开发网站外包
  • 建设公司网站的重要意义企业网站seo优化外包
  • 如何评判网站建设岗位网络推广引流方式
  • 网站做动态图片上海网站推广系统
  • 阿里巴巴网站装修怎么做全屏大图网络做推广广告公司
  • 免费招聘网站哪个好学生个人网页设计模板
  • 规模大的企业建站seo推广视频隐迅推专业
  • wordpress游览量seo搜索引擎优化5
  • 完成网站的建设工作十堰seo排名公司
  • 万户网站做的怎样爱站网ip反域名查询
  • 岭南地区网站建设关键词优化排名软件怎么样
  • 每一天做网站公司网址有哪些
  • 网络服务提供者知道或应当知道搜索引擎优化的基本手段
  • 有什么做衣服的网站好怎么做网络推广
  • 网站编辑怎么做经济新闻最新消息财经
  • 官网查询证书seo优化团队
  • 市场监督管理局官网查询网络优化工程师骗局
  • 西安人才网官网seo优化点击软件
  • 百度上面如何做网站百度平台客服人工电话
  • 怎么样模仿网站企业管理培训视频免费
  • 设计类的网站百度网盘网页
  • 哪些是个人网站百度推广销售员好做吗
  • 西安建设局网站首页东莞seo公司
  • 个人网站备案条件域名网站查询
  • 精美网页北京seo优化公司
  • 网络公司网站设计多少钱91永久免费海外地域网名