大白话React第十二章深入地掌握 React 的高级特性

1. React 前沿 Hooks 深入使用

1.1 useId
  • 白话解释 :在 React 里,有时候我们需要给组件生成唯一的 ID,就像每个人都有唯一的身份证号。useId 这个 Hook 就是专门干这个事儿的,它能在客户端和服务端都生成唯一的 ID,避免两边 ID 不一致出问题。
  • 代码示例
jsx 复制代码
// 引入 React 和 useId Hook
import React, { useId } from'react';

// 定义一个使用 useId 的组件
const UniqueIdComponent = () => {
    // 使用 useId 生成唯一 ID
    const id = useId();
    return (
        <div>
            {/* 使用生成的唯一 ID 作为 input 元素的 id 属性 */}
            <label htmlFor={id}>输入内容:</label>
            <input id={id} type="text" />
        </div>
    );
};

export default UniqueIdComponent;
1.2 useSyncExternalStore
  • 白话解释 :当我们的组件需要和外部数据源(比如浏览器的 localStorageWebSocket 连接等)同步数据时,useSyncExternalStore 就派上用场了。它能让组件在外部数据源变化时及时更新,就像一个小秘书,时刻盯着数据源,有变化就告诉组件。
  • 代码示例
jsx 复制代码
// 引入 React 和 useSyncExternalStore Hook
import React, { useSyncExternalStore } from'react';

// 模拟一个外部数据源,这里用 localStorage
const subscribe = (callback) => {
    window.addEventListener('storage', callback);
    return () => window.removeEventListener('storage', callback);
};

const getSnapshot = () => {
    return localStorage.getItem('myData') || '';
};

// 定义一个使用 useSyncExternalStore 的组件
const ExternalStoreComponent = () => {
    // 使用 useSyncExternalStore 订阅外部数据源
    const data = useSyncExternalStore(subscribe, getSnapshot);
    return (
        <div>
            <p>从外部数据源获取的数据:{data}</p>
        </div>
    );
};

export default ExternalStoreComponent;

2. React 与 Serverless 架构结合

2.1 什么是 Serverless
  • 白话解释:Serverless 就是不用自己管服务器,把服务器相关的事儿都交给云服务提供商。就像你开个小店,不用自己盖房子、装修,直接租个现成的店铺,省事又省钱。在前端开发里,和 Serverless 结合能让我们更专注于业务逻辑,不用操心服务器的维护和扩展。
2.2 代码示例
jsx 复制代码
// 引入 React
import React, { useState, useEffect } from'react';

// 模拟调用 Serverless 函数
const callServerlessFunction = async () => {
    // 这里假设调用一个 Serverless 函数的 API 地址
    const response = await fetch('https://your-serverless-api-url');
    const data = await response.json();
    return data;
};

// 定义一个使用 Serverless 函数的组件
const ServerlessComponent = () => {
    const [data, setData] = useState(null);
    const [isLoading, setIsLoading] = useState(true);

    useEffect(() => {
        const fetchData = async () => {
            try {
                // 调用 Serverless 函数获取数据
                const result = await callServerlessFunction();
                setData(result);
            } catch (error) {
                console.error('调用 Serverless 函数出错:', error);
            } finally {
                setIsLoading(false);
            }
        };

        fetchData();
    }, []);

    return (
        <div>
            {isLoading? (
                <p>正在加载 Serverless 数据...</p>
            ) : (
                <div>
                    <p>从 Serverless 函数获取的数据:{JSON.stringify(data)}</p>
                </div>
            )}
        </div>
    );
};

export default ServerlessComponent;

3. React 应用的测试与部署优化

3.1 React 应用的单元测试
  • 白话解释:单元测试就是把组件一个一个拿出来单独测试,看看它们的功能是不是正常。就像你做拼图,先检查每一块拼图有没有问题。我们可以用 Jest 和 React Testing Library 来做单元测试。
  • 代码示例
jsx 复制代码
// 要测试的组件
import React from'react';

const MyComponent = ({ name }) => {
    return <p>你好,{name}!</p>;
};

export default MyComponent;

// 测试代码
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';

test('MyComponent 显示正确的名字', () => {
    // 渲染组件
    render(<MyComponent name="张三" />);
    // 检查页面上是否包含正确的文本
    const textElement = screen.getByText('你好,张三!');
    expect(textElement).toBeInTheDocument();
});
3.2 React 应用的部署优化
  • 白话解释:部署优化就是让我们的 React 应用部署得更快、更稳定。可以用一些工具和策略,比如使用 CDN(内容分发网络)来加速静态资源的加载,就像在很多地方都建了仓库,用户能从离自己近的仓库拿东西,速度就快了。
  • 代码示例 :在 package.json 里配置部署脚本,使用 gh-pages 把应用部署到 GitHub Pages 上。
json 复制代码
{
    "name": "my-react-app",
    "version": "1.0.0",
    "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        // 配置部署脚本
        "deploy": "gh-pages -d build"
    },
    "dependencies": {
        "react": "^18.2.0",
        "react-dom": "^18.2.0",
        "react-scripts": "5.0.1"
    },
    "devDependencies": {
        "gh-pages": "^4.0.0"
    }
}

然后在终端运行 npm run build 打包应用,再运行 npm run deploy 就可以把应用部署到 GitHub Pages 上了。

4. React 与人工智能的融合探索

4.1 简单的文本生成示例
  • 白话解释:我们可以把 React 和人工智能的 API(比如 OpenAI 的 GPT)结合起来,让应用能生成一些文本内容。就像给应用请了个智能小作家,能根据我们的要求写东西。
  • 代码示例
jsx 复制代码
// 引入 React 和 axios 用于发送请求
import React, { useState } from'react';
import axios from 'axios';

// 定义一个使用 AI 生成文本的组件
const AITextGenerator = () => {
    const [inputText, setInputText] = useState('');
    const [generatedText, setGeneratedText] = useState('');

    const handleSubmit = async () => {
        try {
            // 假设调用 OpenAI 的 API 来生成文本
            const response = await axios.post(
                'https://api.openai.com/v1/chat/completions',
                {
                    model: 'gpt-3.5-turbo',
                    messages: [
                        { role: 'user', content: inputText }
                    ]
                },
                {
                    headers: {
                        'Authorization': `Bearer YOUR_API_KEY`,
                        'Content-Type': 'application/json'
                    }
                }
            );
            // 获取生成的文本
            const text = response.data.choices[0].message.content;
            setGeneratedText(text);
        } catch (error) {
            console.error('调用 AI API 出错:', error);
        }
    };

    return (
        <div>
            <input
                type="text"
                value={inputText}
                onChange={(e) => setInputText(e.target.value)}
                placeholder="输入提示信息"
            />
            <button onClick={handleSubmit}>生成文本</button>
            <p>生成的文本:{generatedText}</p>
        </div>
    );
};

export default AITextGenerator;

通过学习这些内容,你能更深入地掌握 React 的高级特性,还能把 React 和其他技术结合起来,做出更强大、更智能的应用。

useSyncExternalStore在实际项目中的应用场景

1. useSyncExternalStore 是啥

在 React 里,组件一般处理自己内部的状态。但有时候,组件得和外部数据源打交道,像浏览器的 localStorage、实时更新的 WebSocket 连接、系统的主题设置等。useSyncExternalStore 这个 Hook 就是用来让组件和这些外部数据源同步数据的,保证组件能及时响应外部数据的变化。

2. 实际项目中的应用场景

2.1 监听 localStorage 变化
  • 白话解释localStorage 就像浏览器里的一个小仓库,能存一些数据。有时候我们在一个页面改了 localStorage 里的数据,希望另一个页面能马上知道并且更新显示。这时候 useSyncExternalStore 就能帮我们监听 localStorage 的变化,让组件跟着更新。
  • 代码示例
jsx 复制代码
// 引入 React 和 useSyncExternalStore Hook
import React, { useSyncExternalStore } from'react';

// 订阅函数,用于监听 storage 事件
// 当 storage 变化时,会调用传入的回调函数
const subscribe = (callback) => {
    // 监听 window 的 storage 事件
    window.addEventListener('storage', callback);
    // 返回一个取消订阅的函数
    return () => window.removeEventListener('storage', callback);
};

// 获取当前 localStorage 里的数据
const getSnapshot = () => {
    return localStorage.getItem('userData') || '暂无数据';
};

// 定义一个组件,使用 useSyncExternalStore 监听 localStorage 变化
const LocalStorageComponent = () => {
    // 使用 useSyncExternalStore 订阅外部数据源
    const data = useSyncExternalStore(subscribe, getSnapshot);
    return (
        <div>
            {/* 显示从 localStorage 获取的数据 */}
            <p>从 localStorage 获取的数据:{data}</p>
        </div>
    );
};

export default LocalStorageComponent;
2.2 监听 WebSocket 连接的数据更新
  • 白话解释WebSocket 就像一个实时的通信管道,能在浏览器和服务器之间实时传数据。在一些实时聊天、股票行情显示等应用里,我们希望页面能实时显示服务器传来的新数据。useSyncExternalStore 可以监听 WebSocket 的消息,让组件及时更新显示。
  • 代码示例
jsx 复制代码
// 引入 React 和 useSyncExternalStore Hook
import React, { useSyncExternalStore } from'react';

// 创建 WebSocket 连接
const socket = new WebSocket('ws://your-websocket-url');

// 存储最新的消息
let latestMessage = '暂无消息';

// 订阅函数,监听 WebSocket 的消息事件
const subscribe = (callback) => {
    // 当收到消息时,更新最新消息并调用回调函数
    socket.onmessage = (event) => {
        latestMessage = event.data;
        callback();
    };
    // 返回一个取消订阅的函数
    return () => {
        socket.close();
    };
};

// 获取当前最新的消息
const getSnapshot = () => {
    return latestMessage;
};

// 定义一个组件,使用 useSyncExternalStore 监听 WebSocket 消息
const WebSocketComponent = () => {
    // 使用 useSyncExternalStore 订阅外部数据源
    const message = useSyncExternalStore(subscribe, getSnapshot);
    return (
        <div>
            {/* 显示从 WebSocket 获取的消息 */}
            <p>从 WebSocket 获取的消息:{message}</p>
        </div>
    );
};

export default WebSocketComponent;
2.3 监听系统主题变化
  • 白话解释 :现在很多操作系统都支持切换主题,像浅色模式和深色模式。我们的网页也想跟着系统主题变化,让用户有一致的体验。useSyncExternalStore 能监听系统主题的变化,然后让网页主题也跟着变。
  • 代码示例
jsx 复制代码
// 引入 React 和 useSyncExternalStore Hook
import React, { useSyncExternalStore } from'react';

// 订阅函数,监听系统主题变化事件
const subscribe = (callback) => {
    // 媒体查询,判断系统是否处于深色模式
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    // 监听媒体查询的变化
    const handleChange = () => callback();
    mediaQuery.addEventListener('change', handleChange);
    // 返回一个取消订阅的函数
    return () => mediaQuery.removeEventListener('change', handleChange);
};

// 获取当前系统的主题模式
const getSnapshot = () => {
    return window.matchMedia('(prefers-color-scheme: dark)').matches? 'dark' : 'light';
};

// 定义一个组件,使用 useSyncExternalStore 监听系统主题变化
const ThemeComponent = () => {
    // 使用 useSyncExternalStore 订阅外部数据源
    const theme = useSyncExternalStore(subscribe, getSnapshot);
    return (
        <div>
            {/* 显示当前系统的主题模式 */}
            <p>当前系统主题:{theme}</p>
        </div>
    );
};

export default ThemeComponent;

通过这些例子可以看出,useSyncExternalStore 在处理外部数据源变化时非常有用,能让 React 组件和外部世界保持同步。

如何深入学习React的高级特性?

1. 深入理解 Hooks

1.1 useReducer
  • 白话解释useReducer 就像是一个小管家,专门负责管理组件里复杂的状态变化。当你的组件状态改变逻辑比较多,用 useState 处理起来太麻烦的时候,就可以用 useReducer。它把状态的改变规则都写在一个函数里,让代码更有条理。
  • 代码示例
jsx 复制代码
// 引入 React 和 useReducer Hook
import React, { useReducer } from'react';

// 定义 reducer 函数,它接收当前状态和动作,返回新的状态
const counterReducer = (state, action) => {
    switch (action.type) {
        case 'increment':
            return { count: state.count + 1 };
        case 'decrement':
            return { count: state.count - 1 };
        default:
            return state;
    }
};

// 定义使用 useReducer 的组件
const Counter = () => {
    // 使用 useReducer 初始化状态和获取 dispatch 函数
    const [state, dispatch] = useReducer(counterReducer, { count: 0 });

    return (
        <div>
            <p>当前计数: {state.count}</p>
            {/* 点击按钮时,通过 dispatch 发送动作 */}
            <button onClick={() => dispatch({ type: 'increment' })}>增加</button>
            <button onClick={() => dispatch({ type: 'decrement' })}>减少</button>
        </div>
    );
};

export default Counter;
1.2 useContext
  • 白话解释useContext 就像一个公共的储物箱,组件之间可以通过它来共享数据。如果有很多层嵌套的组件都需要用到某个数据,一层一层传递数据太麻烦,这时候就可以把数据放到 useContext 里,需要的组件直接去取就行。
  • 代码示例
jsx 复制代码
// 引入 React 和 createContext、useContext
import React, { createContext, useContext } from'react';

// 创建一个上下文对象
const UserContext = createContext();

// 定义一个父组件,用于提供上下文数据
const ParentComponent = () => {
    const user = { name: '张三', age: 25 };
    return (
        // 使用 Provider 提供上下文数据
        <UserContext.Provider value={user}>
            <ChildComponent />
        </UserContext.Provider>
    );
};

// 定义一个子组件,使用 useContext 获取上下文数据
const ChildComponent = () => {
    // 使用 useContext 获取上下文数据
    const user = useContext(UserContext);
    return (
        <div>
            <p>用户姓名: {user.name}</p>
            <p>用户年龄: {user.age}</p>
        </div>
    );
};

export default ParentComponent;

2. 掌握 React 并发模式

2.1 并发模式概述
  • 白话解释:并发模式就像是一个超级高效的工作者,能同时处理多个任务,还能根据任务的紧急程度合理安排顺序。在 React 里,它能让页面在加载数据或者进行复杂计算的时候,还能保持流畅的交互,不会让用户觉得卡顿。
2.2 代码示例(简单示意)
jsx 复制代码
// 引入 React
import React from'react';

// 定义一个模拟异步加载数据的组件
const AsyncDataComponent = () => {
    // 模拟异步加载数据
    const data = new Promise((resolve) => {
        setTimeout(() => {
            resolve('这是加载的数据');
        }, 2000);
    });

    return (
        <React.Suspense fallback={<p>数据加载中...</p>}>
            {/* 这里假设使用了并发模式的一些特性来处理异步数据 */}
            <div>{data}</div>
        </React.Suspense>
    );
};

export default AsyncDataComponent;

3. 学习 React Server Components(RSC)

3.1 RSC 解释
  • 白话解释:React Server Components 就像是在服务器那边提前把饭菜做好,然后直接端给客户端。它能在服务器端渲染组件,减少客户端的负担,让页面加载速度更快。一些不需要客户端交互的数据,就可以用 RSC 来处理。
3.2 代码示例(使用 Next.js 13+ 示例)
jsx 复制代码
// 服务端组件示例,在 app 目录下创建 page.js
// 模拟从服务器获取文章列表
async function fetchArticles() {
    const response = await fetch('https://api.example.com/articles');
    return response.json();
}

// 定义服务端组件
export default async function HomePage() {
    // 等待获取文章数据
    const articles = await fetchArticles();
    return (
        <div>
            <h1>文章列表</h1>
            <ul>
                {articles.map(article => (
                    <li key={article.id}>{article.title}</li>
                ))}
            </ul>
        </div>
    );
}

4. 探索 React 与其他技术的融合

4.1 React 与 GraphQL 结合
  • 白话解释:GraphQL 就像是一个聪明的小秘书,能根据你的需求精准地从服务器获取数据。把 React 和 GraphQL 结合起来,能让你的应用更高效地获取和展示数据。
  • 代码示例
jsx 复制代码
// 引入 React、Apollo Client 相关模块
import React from'react';
import { ApolloClient, InMemoryCache, ApolloProvider, gql } from '@apollo/client';
import { useQuery } from '@apollo/client';

// 创建 Apollo Client 实例
const client = new ApolloClient({
    uri: 'https://your-graphql-server-url',
    cache: new InMemoryCache()
});

// 定义 GraphQL 查询
const GET_USERS = gql`
    query GetUsers {
        users {
            id
            name
            email
        }
    }
`;

// 定义使用 GraphQL 查询的组件
const UserList = () => {
    // 使用 useQuery 执行 GraphQL 查询
    const { loading, error, data } = useQuery(GET_USERS);

    if (loading) return <p>加载用户数据中...</p>;
    if (error) return <p>获取用户数据出错: {error.message}</p>;

    return (
        <div>
            <h2>用户列表</h2>
            <ul>
                {data.users.map(user => (
                    <li key={user.id}>{user.name} - {user.email}</li>
                ))}
            </ul>
        </div>
    );
};

// 使用 ApolloProvider 提供 Apollo Client
const App = () => {
    return (
        <ApolloProvider client={client}>
            <UserList />
        </ApolloProvider>
    );
};

export default App;
4.2 React 与 WebAssembly 结合
  • 白话解释:WebAssembly 就像是一个超级加速器,能让 JavaScript 代码运行得更快。把 React 和 WebAssembly 结合起来,能提升应用的性能,特别是对于一些需要大量计算的场景。
  • 代码示例
jsx 复制代码
// 引入 React
import React, { useEffect, useState } from'react';

// 定义一个使用 WebAssembly 的组件
const WebAssemblyComponent = () => {
    const [result, setResult] = useState(null);

    useEffect(() => {
        const fetchWasm = async () => {
            // 加载 WebAssembly 模块
            const wasmModule = await WebAssembly.instantiateStreaming(
                fetch('example.wasm'),
                {}
            );
            // 获取 WebAssembly 模块中的加法函数
            const add = wasmModule.instance.exports.add;
            const num1 = 5;
            const num2 = 3;
            // 调用加法函数进行计算
            const sum = add(num1, num2);
            setResult(sum);
        };
        fetchWasm();
    }, []);

    return (
        <div>
            {result!== null? (
                <p>{`5 + 3 的结果是: ${result}`}</p>
            ) : (
                <p>正在计算...</p>
            )}
        </div>
    );
};

export default WebAssemblyComponent;

要深入学习和掌握 React 的高级特性,你可以多动手写代码,把这些示例都跑一跑,然后试着修改代码,看看会有什么变化。同时,多看看官方文档和相关的技术博客,加深对这些特性的理解。

分享一些优化React项目性能的经验

1. 代码分割与懒加载

白话解释

想象一下,你去超市购物,如果一次性把整个超市的东西都搬回家,那得多费劲呀。在 React 项目里,代码就像超市里的商品,如果一次性把所有代码都加载进来,页面加载速度就会很慢。代码分割和懒加载就是让我们只在需要的时候才去加载对应的代码,就像你需要什么商品就去拿什么商品,这样能大大提高页面的加载速度。

代码示例
jsx 复制代码
// 引入 React 的 lazy 和 Suspense 组件
import React, { lazy, Suspense } from'react';

// 使用 lazy 函数实现组件的懒加载,这里假设 OtherComponent 是一个很大的组件
const OtherComponent = lazy(() => import('./OtherComponent'));

const App = () => {
    return (
        <div>
            {/* 使用 Suspense 组件,当 OtherComponent 还在加载时,显示加载提示 */}
            <Suspense fallback={<div>正在加载组件...</div>}>
                {/* 渲染懒加载的组件 */}
                <OtherComponent />
            </Suspense>
        </div>
    );
};

export default App;

2. 使用 React.memo 避免不必要的渲染

白话解释

在 React 里,组件就像一个个小工人,当它们的"工作内容"(也就是 props)没有变化时,就没必要重新"干活"(重新渲染)。React.memo 就像是一个小管家,它会检查组件的 props 有没有变化,如果没有变化,就不让组件重新渲染,这样能节省很多性能。

代码示例
jsx 复制代码
// 引入 React 和 React.memo
import React from'react';

// 使用 React.memo 包裹一个纯函数组件,当这个组件的 props 没有变化时,不会重新渲染
const MyComponent = React.memo(({ name }) => {
    return <p>你好,{name}!</p>;
});

const App = () => {
    const [count, setCount] = React.useState(0);
    return (
        <div>
            <button onClick={() => setCount(count + 1)}>点击增加计数</button>
            {/* 这里 MyComponent 的 props 没有变化,不会重新渲染 */}
            <MyComponent name="张三" />
            <p>计数: {count}</p>
        </div>
    );
};

export default App;

3. 使用 useCallback 和 useMemo 缓存函数和计算结果

白话解释

有时候,我们在组件里会定义一些函数或者进行一些复杂的计算。如果每次组件渲染都重新定义函数或者重新计算,会很浪费性能。useCallback 可以帮我们缓存函数,useMemo 可以帮我们缓存计算结果。就像你把经常要用的工具放在一个固定的地方,下次用的时候直接拿,不用再重新做一个工具;或者把算好的结果记下来,下次要用直接看记录,不用再重新算一遍。

代码示例
jsx 复制代码
// 引入 React 的 useCallback 和 useMemo
import React, { useCallback, useMemo, useState } from'react';

// 一个复杂的计算函数
const expensiveCalculation = (num) => {
    console.log('进行复杂计算...');
    return num * 2;
};

const App = () => {
    const [count, setCount] = useState(0);
    const [input, setInput] = useState(0);

    // 使用 useCallback 缓存函数,只有当 count 变化时才会重新创建这个函数
    const handleClick = useCallback(() => {
        setCount(count + 1);
    }, [count]);

    // 使用 useMemo 缓存计算结果,只有当 input 变化时才会重新计算
    const result = useMemo(() => expensiveCalculation(input), [input]);

    return (
        <div>
            <button onClick={handleClick}>点击增加计数</button>
            <input
                type="number"
                value={input}
                onChange={(e) => setInput(Number(e.target.value))}
            />
            <p>计数: {count}</p>
            <p>计算结果: {result}</p>
        </div>
    );
};

export default App;

4. 优化 CSS 加载和渲染

白话解释

CSS 就像给页面穿衣服,如果衣服太大或者加载得太慢,页面展示起来就会不美观或者很慢。我们要优化 CSS 的加载和渲染,让页面能快速穿上合适的"衣服"。可以通过压缩 CSS 文件、使用 CSS Modules 避免样式冲突等方式来优化。

代码示例
jsx 复制代码
// 引入 CSS 文件,这里假设使用 CSS Modules
import styles from './App.module.css';

const App = () => {
    return (
        <div className={styles.container}>
            <h1 className={styles.title}>优化 CSS 示例</h1>
            <p className={styles.text}>这是一个优化 CSS 加载和渲染的示例。</p>
        </div>
    );
};

export default App;

App.module.css 文件里:

css 复制代码
/* 定义容器样式 */
.container {
    padding: 20px;
    background-color: #f0f0f0;
}

/* 定义标题样式 */
.title {
    color: #333;
    font-size: 24px;
}

/* 定义文本样式 */
.text {
    color: #666;
    font-size: 16px;
}

5. 减少 DOM 操作

白话解释

DOM 就像是页面的"骨架",频繁地操作这个"骨架"会让页面变得很"累",影响性能。我们要尽量减少不必要的 DOM 操作,能不改动"骨架"就不改动,实在要改动,就一次性把要改的地方都改好。

代码示例
jsx 复制代码
// 引入 React
import React, { useState } from'react';

const App = () => {
    const [list, setList] = useState([]);

    const handleAddItem = () => {
        // 先创建一个新的数组,把新元素添加进去
        const newList = [...list, `项目 ${list.length + 1}`];
        // 一次性更新状态,避免多次触发 DOM 操作
        setList(newList);
    };

    return (
        <div>
            <button onClick={handleAddItem}>添加项目</button>
            <ul>
                {list.map((item, index) => (
                    <li key={index}>{item}</li>
                ))}
            </ul>
        </div>
    );
};

export default App;

通过以上这些方法,我们可以让 React 项目运行得更快、更流畅,提升用户体验。

相关推荐
GISer_Jing24 分钟前
React Native从入门到进阶详解
javascript·react native·react.js
黑风风39 分钟前
深入理解 Promise 和 Async/Await,并结合 Axios 实践
开发语言·前端·javascript
我命由我123451 小时前
Tailwind CSS 问题:npm error could not determine executable to run
前端·css·前端框架·npm·node.js·html·html5
PBitW1 小时前
阅读《Vue.js设计与实现》 -- 02
前端·vue.js·面试
浩男孩1 小时前
面试官提问:TypeScript 中的 Type 和 Interface 有什么区别?
前端·typescript
m0_582481491 小时前
qt作业day2
java·linux·前端
好想Z☡zᶻ2 小时前
调用的子组件中使用v-model绑定数据以及使用@调用方法
前端·javascript·vue.js
seven1082 小时前
cursor MCP server 如何AI 编程中实现动态数据获取
前端·cursor·mcp
予安灵2 小时前
《白帽子讲 Web 安全》之文件操作安全
前端·安全·web安全·系统安全·网络攻击模型·安全威胁分析·文件操作安全
m0_748244962 小时前
WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程
前端