RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1445726
Accepted
gorden
gorden
Asked:2022-09-05 01:17:39 +0000 UTC2022-09-05 01:17:39 +0000 UTC 2022-09-05 01:17:39 +0000 UTC

React.js 输入值

  • 772

当您更改输入 X,Y 中的值时,会发出此警告

警告:组件正在将受控输入更改为不受控。这可能是由于值从定义变为未定义引起的,这不应该发生。决定在组件的生命周期内使用受控输入元素还是不受控输入元素。更多信息:https ://reactjs.org/link/controlled-components

在您已经更改了数字并且想要移动 div 之后,X 或 Y 会非常快速地增加其值并且 div 会超出窗口警告 (2)

警告:收到value属性的 NaN。如果这是预期的,请将值转换为字符串。

codeandbox.io 上的代码在这里

import "./styles.css";
import React, { useRef, useState, useEffect } from "react";

const appStyle = {
  fontFamily: "sansSerif",
  textAlign: "center",
  userSelect: "none"
};

const inputCStyle = {
  width: "100px",
  height: " 30px",
  fontSize: "4vw",
  position: "relative",
  top: "0",
  left: "0",
  display: "flex",
  cursor: "pointer"
};

const h1Style = {
  display: "block",
  margin: "0",
  padding: "0",
  marginLeft: "20px",
  paddingRight: "10px"
};

const quickAndDirtyStyle = {
  width: "200px",
  height: "200px",
  background: "#FF9900",
  color: "#FFFFFF",
  display: "flex",
  justifyContent: "center",
  alignItems: "center"
};

export default function App() {
  const [pressed, setPressed] = useState(false);
  const [position, setPosition] = useState({ x: 0, y: 0 });
  const ref = useRef();

  // Monitor changes to position state and update DOM
  useEffect(() => {
    if (ref.current) {
      ref.current.style.marginLeft = `${position.x}px`;
      ref.current.style.marginTop = `${position.y}px`;
    }
  }, [position]);

  // Update the current position if mouse is down
  const onMouseMove = (event) => {
    if (pressed) {
      setPosition({
        x: position.x + event.movementX,
        y: position.y + event.movementY
      });
    }
  };

  const handleChange = (e, type) => {
    setPosition({
      [type]: e.target.value
    });
  };

  const inputCP = useRef();
  const editItemCP = () => {
    inputCP.current.select();
  };

  return (
    <div className="App" style={appStyle}>
      <div style={{ display: "flex" }}>
        <h1 style={h1Style}>X</h1>
        <input
          style={inputCStyle}
          className="inputC"
          type="number"
          value={position.x}
          ref={inputCP}
          onClick={editItemCP}
          onChange={(e) => handleChange(e, "x")}
        />
        <h1 style={h1Style}>Y</h1>
        <input
          style={inputCStyle}
          className="inputC"
          type="number"
          value={position.y}
          onChange={(e) => handleChange(e, "y")}
        />
      </div>
      <div
        style={{
          position: "absolute",
          top: "50%",
          left: "50%",
          transform: "translate(-50%,-50%)"
        }}
      >
        <div
          ref={ref}
          style={quickAndDirtyStyle}
          onMouseMove={onMouseMove}
          onMouseDown={() => setPressed(true)}
          onMouseUp={() => setPressed(false)}
          onMouseLeave={() => setPressed(false)}
        >
          <p>{pressed ? "Dragging..." : "Press to drag"}</p>
        </div>
      </div>
    </div>
  );
}
javascript
  • 0 0 个回答
  • 0 Views

0 个回答

  • Voted
  1. Best Answer
    Oliver Patterson
    2022-09-05T01:50:07Z2022-09-05T01:50:07Z

    第一个问题是 with [type]: e.target.value,它value存储的是字符串,而不是数字。正如@Excess gophers的评论中所建议的那样,我们通过用 ore.target.value替换来解决这个问题。 第二个问题是之后:Number(e.target.value)e.target.valueAsNumber

    setPosition({
      [type]: e.target.value
    });
    

    状态包含一个只有一个属性的对象(比如说{x: 100}or {y: 100}),为了避免这种情况,您需要使用[type]: e.target.value或者将旧状态解包到一个新对象中[type]: Number(e.target.value)。

    import "./styles.css";
    import React, { useRef, useState, useEffect } from "react";
    
    const appStyle = {
      fontFamily: "sansSerif",
      textAlign: "center",
      userSelect: "none"
    };
    
    const inputCStyle = {
      width: "100px",
      height: " 30px",
      fontSize: "4vw",
      position: "relative",
      top: "0",
      left: "0",
      display: "flex",
      cursor: "pointer"
    };
    
    const h1Style = {
      display: "block",
      margin: "0",
      padding: "0",
      marginLeft: "20px",
      paddingRight: "10px"
    };
    
    const quickAndDirtyStyle = {
      width: "200px",
      height: "200px",
      background: "#FF9900",
      color: "#FFFFFF",
      display: "flex",
      justifyContent: "center",
      alignItems: "center"
    };
    
    export default function App() {
      const [pressed, setPressed] = useState(false);
      const [position, setPosition] = useState({ x: 0, y: 0 });
      const ref = useRef();
    
      // Monitor changes to position state and update DOM
      useEffect(() => {
        if (ref.current) {
          ref.current.style.marginLeft = `${position.x}px`;
          ref.current.style.marginTop = `${position.y}px`;
        }
      }, [position]);
    
      // Update the current position if mouse is down
      const onMouseMove = (event) => {
        if (pressed) {
          setPosition({
            x: position.x + event.movementX,
            y: position.y + event.movementY
          });
        }
      };
    
      const handleChange = (e, type) => {
        // Изменения
        setPosition((prev) => {
          return { ...prev, [type]: e.target.valueAsNumber }; // или же вместо e.target.valueAsNumber делаем Number(e.target.value)
        });
      };
    
      const inputCP = useRef();
      const editItemCP = () => {
        inputCP.current.select();
      };
    
      return (
        <div className="App" style={appStyle}>
          <div style={{ display: "flex" }}>
            <h1 style={h1Style}>X</h1>
            <input
              style={inputCStyle}
              className="inputC"
              type="number"
              value={position.x}
              ref={inputCP}
              onClick={editItemCP}
              onChange={(e) => handleChange(e, "x")}
            />
            <h1 style={h1Style}>Y</h1>
            <input
              style={inputCStyle}
              className="inputC"
              type="number"
              value={position.y}
              onChange={(e) => handleChange(e, "y")}
            />
          </div>
          <div
            style={{
              position: "absolute",
              top: "50%",
              left: "50%",
              transform: "translate(-50%,-50%)"
            }}
          >
            <div
              ref={ref}
              style={quickAndDirtyStyle}
              onMouseMove={onMouseMove}
              onMouseDown={() => setPressed(true)}
              onMouseUp={() => setPressed(false)}
              onMouseLeave={() => setPressed(false)}
            >
              <p>{pressed ? "Dragging..." : "Press to drag"}</p>
            </div>
          </div>
        </div>
      );
    }
    
    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5