React Hooks useMemo

发布于:2025-09-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

    React Native+Taro+TypeScript的开发环境,useMemo的一些简单的使用

import React, { useState, useMemo } from "react";
import { View, Text, Input, Button } from "@tarojs/components";
import './index.scss';

const expensiveCalculation = (num: number):number => {
  console.log('Calculating...')
  for (let index = 0; index < 1000000000; index++) {
    num += 1
  }
  return num
}

// 用户数据类型
interface User {
  id: number
  name: string
  age: number
}
const UseMemoExample:React.FC = ()=> {
  const [count, setCount] = useState<number>(0);
  const [users, setUsers] = useState<User[]>([
    {id:1, name:'Alice', age: 25},
    {id:2, name:'Bob', age: 30},
    {id:3, name:'Charlie', age:35},
  ]);
  const [searchTerm, setSearchTerm] = useState<string>('');
  
  // 使用 useMemo 缓存昂贵的计算结果
  const calculatedValue = useMemo<number>(()=>{
    return expensiveCalculation(count)
  }, [count])

  // 使用 useMemo 过滤用户列表,避免每次渲染都重新计算
  const filteredUsers = useMemo<User[]>(()=>{
    console.log('Filtering users...')
    return users.filter(user=>
      user.name.toLowerCase().includes(searchTerm.toLowerCase())
    )
  }, [users, searchTerm])

  // 使用 useMemo 缓存组件,避免不必要的重新渲染
  const userList = useMemo(()=>{
    return filteredUsers.map(user=>(
      <View key={user.id} className='txt'>
        <Text>{user.name} - {user.age} years old</Text>
      </View>
    ), [filteredUsers])
  })

  const addUser = () => {
    const newId = users.length + 1
    setUsers([...users, {
      id: newId,
      name: `User ${newId}`,
      age: Math.floor(Math.random() * 30) + 20
    }])
  }

  return (
    <View className='container'>
      <Text className='txt'>useMemo Example</Text>

      <View className='container'>
        <Text className='txt'>Expensive Calculation</Text>
        <Text className='txt'>Count: {count}</Text>
        <Text className='txt'>Calculated Value: {calculatedValue}</Text>
        <Button className='btn' onClick={()=>setCount(count + 1)}>Increment</Button>
      </View>

      <View className='container'>
        <Text className='txt'>User Search</Text>
        <Input
          style={{
            width: 320,
            height: 74,
            backgroundColor: 'darkkhaki',
            marginBottom: 30
          }}
          type='text'
          value={searchTerm}
          onInput={(e)=>setSearchTerm(e.detail.value)}
          placeholder='Search users...'
        />
        <Text className='txt'>Filter Users:</Text>
        {userList}
        <Button className='btn' onClick={addUser}>Add Random User</Button>
      </View>
    </View>
  )
}

export default UseMemoExample


网站公告

今日签到

点亮在社区的每一天
去签到