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多很多

相关推荐
JeffongTan4 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
不cong明的亚子6 小时前
web live多屏互动平台
javascript·经验分享·音视频
陆枫Larry6 小时前
Astro 是什么
前端
是立不是利8 小时前
写给设计师的 CSS 博客美学指南
前端·css
dsyyyyy11018 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
默_笙8 小时前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师9 小时前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen9 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员
a1117769 小时前
Shirone 二次元博客主题 开源
前端·开源
IT_陈寒9 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端