React19 中的交互操作

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

需要安装的库 antd-mobile、use-immer

在App.jsx 中引入组件 Action
import "./App.css"
import Action from "./pages/action"
function App() {
  return (
    <>
      <Action></Action>
    </>
  )
}

export default App
action.jsx 组件
import LearnInteraction from "../components/learnInteraction"
import { useState } from "react"
import { Button, Space, Input } from "antd-mobile"
// 使用 use-immer 库来简化复杂状态的更新
import { useImmer } from "use-immer"

const action = () => {
  const [count, setCount] = useState(0)

  // 对于复杂数据类型中的对象,不要直接修改原始对象,而是创建一个新的对象来替换
  const [obj1, setObj1] = useState({
    age: { name: { value: 18 } },
  })

  // 使用 use-immer 库管理状态 - 允许直接修改 draft 对象
  const [obj2, setObj2] = useImmer({
    age: { name: { value: 20 } },
  })

  return (
    <div style={{ width: "100%", height: "100%" }}>
      {/* 事件处理和冒泡示例 */}
      <Space
        style={{ "--gap": "50px", width: "100%", height: "100%" }}
        className="adm-space"
        onClick={() => alert("冒泡了")}
      >
        <LearnInteraction
          onClick={(e) => {
            // 阻止事件冒泡到父元素
            e.stopPropagation()
            alert("点击了")
          }}
        ></LearnInteraction>
        <Button
          color="primary"
          fill="solid"
          onClick={() => setCount(count + 1)}
        >
          {count}
        </Button>
      </Space>
      <Space
        style={{
          "--gap": "50px",
          width: "100%",
          height: "100%",
        }}
      >
        <div>
          <div>
            {/* 对于深层嵌套对象,使用展开运算符的方式更新状态,代码会变得冗长且难以维护 */}
            {obj1.age.name.value}
            <Input
              style={{ border: "1px solid Gray" }}
              placeholder="请输入年龄"
              value={obj1.age.name.value}
              onChange={(val) => {
                setObj1({
                  ...obj1,
                  age: {
                    ...obj1.age,
                    name: {
                      ...obj1.age.name,
                      value: val,
                    },
                  },
                })
              }}
            />
            {/* 使用 use-immer 库更新复杂嵌套对象 - 可以直接修改 draft 对象,代码更简洁 */}
            {obj2.age.name.value}
            <Input
              style={{ border: "1px solid Gray" }}
              placeholder="请输入年龄"
              value={obj2.age.name.value}
              onChange={(val) => {
                setObj2((draft) => {
                  draft.age.name.value = val
                })
              }}
            />
          </div>
        </div>
      </Space>
    </div>
  )
}

export default action
learnInteraction.jsx 组件
import { Button } from "antd-mobile"
const learnInteraction = ({ onClick }) => {
  return (
    <div>
      <Button color="primary" fill="solid" onClick={onClick}>
        会冒泡
      </Button>
      <form
        onSubmit={(e) => {
          // 阻止默认行为
          e.preventDefault()
          alert("提交表单!")
        }}
        onClick={(e) => e.stopPropagation()}
      >
        <input />
        <button onClick={(e) => e.stopPropagation()}>发送</button>
      </form>
    </div>
  )
}

export default learnInteraction

网站公告

今日签到

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