React状态管理器的应用

Vue的响应能力,直接改变data()里面字段的值UI就会自动刷新,而react不会,如下代码:

javascript 复制代码
import React from 'react';
import { Badge, TabBar, Button } from 'antd-mobile';
import {
  ScanningOutline,
  AppOutline,
  MessageOutline,
  MessageFill,
  UnorderedListOutline,
  UserOutline,
} from 'antd-mobile-icons';



const Menu = () => {
  let products=[
    { title: '卷心菜', isFruit: false, id: 1 },
    { title: '大蒜', isFruit: false, id: 2 },
    { title: '苹果', isFruit: true, id: 3 }
  ];

  const ShoppingList = () => {
    return (
      <ul>
        {products.map(i => (
          <li key={i.id} style={{ color: i.isFruit ? 'magenta' : 'darkgreen' }}>
            {i.title}
          </li>
        ))}
      </ul>
    );
  };
  return (
    <div style={{ padding: 20 }}>
      <h2>菜单页面</h2>
      <ShoppingList />
      <div>
        <Button type="primary" onClick={() => {
          const productName = prompt('请输入产品名称');
          if (productName) {
            const newProduct = {
              title: productName,
              isFruit: false,
              id: products.length + 1
            };
            products=[...products, newProduct];
          }
        }}>添加11</Button>
      </div>
    </div>
  );
};
export default Menu;

直接改变products,界面中的products列表不会刷新。

这时候要引入状态管理器:

javascript 复制代码
import React, { useState } from 'react';
import { Badge, TabBar, Button } from 'antd-mobile';
import {
  ScanningOutline,
  AppOutline,
  MessageOutline,
  MessageFill,
  UnorderedListOutline,
  UserOutline,
} from 'antd-mobile-icons';



const Menu = () => {
  const [products, setProducts] = useState([
    { title: '卷心菜', isFruit: false, id: 1 },
    { title: '大蒜', isFruit: false, id: 2 },
    { title: '苹果', isFruit: true, id: 3 }
  ]);

  const ShoppingList = () => {
    return (
      <ul>
        {products.map(i => (
          <li key={i.id} style={{ color: i.isFruit ? 'magenta' : 'darkgreen' }}>
            {i.title}
          </li>
        ))}
      </ul>
    );
  };
  return (
    <div style={{ padding: 20 }}>
      <h2>菜单页面</h2>
      <ShoppingList />
      <div>
        <Button type="primary" onClick={() => {
          const productName = prompt('请输入产品名称');
          if (productName) {
            const newProduct = {
              title: productName,
              isFruit: false,
              id: products.length + 1
            };
            setProducts([...products, newProduct]);
          }
        }}>添加</Button>
      </div>
    </div>
  );
};
export default Menu;

需要注意的是useState要在组件内部使用!ShoppingList 可以放到组件外部,带上参数即可,如下:

javascript 复制代码
...
// 将 ShoppingList 函数移到组件外部
const ShoppingList = (props) => {
  const { args } = props;
  return (
    <ul>
      {args.map(i => (
        <li key={i.id} style={{ color: i.isFruit ? 'magenta' : 'darkgreen' }}>
          {i.title}
        </li>
      ))}
    </ul>
  );
};

const Menu = () => {
  const [products, setProducts] = useState([
    { title: '卷心菜', isFruit: false, id: 1 },
    { title: '大蒜', isFruit: false, id: 2 },
    { title: '苹果', isFruit: true, id: 3 }
  ]);

  return (
    <div style={{ padding: 20 }}>
      <h2>菜单页面</h2>
      <ShoppingList args={products} />
      <div>
        <Button type="primary" onClick={() => {
          const productName = prompt('请输入产品名称');
          if (productName) {
            const newProduct = {
              title: productName,
              isFruit: false,
              id: products.length + 1
            };
            setProducts([...products, newProduct]);
          }
        }}>添加</Button>
      </div>
    </div>
  );
};
export default Menu;

吐槽一下,React代码量要比vue多很多

相关推荐
其实防守也摸鱼13 分钟前
前端应用的离线暂停更新策略:构建稳定可靠的渐进式部署方案
服务器·前端·数据库·学习·ai·命令行·linux系统
太平洋月光21 分钟前
Antv G2中自定义技巧📊
前端·数据可视化
shmily麻瓜小菜鸡32 分钟前
前端“伪防盗链”方案
前端·javascript·vue.js·bootstrap·echarts
mayaairi33 分钟前
JS数组完全指南(含十大操作详解)
开发语言·前端·javascript
IT_陈寒1 小时前
Python的线程池把我CPU跑满了,原来少传了个参数
前端·人工智能·后端
喜欢的名字被抢了1 小时前
写-Chrome-扩展时踩过的那些-MV3-的坑
前端·chrome
网安老伯1 小时前
网络安全基础要点知识介绍(非常详细),零基础入门到精通,看这一篇就够了
运维·前端·网络协议·web安全·网络安全·职场和发展
AndyHeee1 小时前
Linux 内核底层机制:设备树(Device Tree)的数据结构与内存组织
linux·前端·数据结构
wuqingshun3141591 小时前
springBoot是如何通过main方法启动web项目的?
前端·spring boot·后端
xxwl5851 小时前
HTML 小总结:从骨架到枝叶,系统掌握网页结构
前端·html