RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1553533
Accepted
Caplex
Caplex
Asked:2023-11-28 13:23:52 +0000 UTC2023-11-28 13:23:52 +0000 UTC 2023-11-28 13:23:52 +0000 UTC

条件运算符不考虑条件变化

  • 772

我有一个 React 组件,表示带有输入(文本、数字、日期)的表单。日期输入有一个默认值 - Today( today)。我将这一组件用于两个功能:创建对象和编辑对象。在第一种情况下,默认情况下所有输入都是空的,除了包含值的日期输入today。在第二种情况下,输入从可选的 props( values) 接收默认值,这些默认值从父组件的状态提供给组件。该组件以两份副本呈现在页面上,一份values已传输,另一份未传输。由于存在values是可选的,因此我在每个输入的默认值中包含了一个条件语句。在日期导入的情况下,它看起来像这样:

defaultValue={inputValues?.date ? inputValues.date : today}

在其他情况下,today会放置一个空字符串''。

我预计当状态发生变化时,组件将被重新渲染并插入到默认输入值中values。实际上,这种情况仅发生在默认为空的输入中,并且带有日期的输入始终具有值today。

通过控制台,我看到组件渲染时,inputValue该值是未定义的(useState它显示为空括号),所以一开始我认为values它在渲染时没有时间出现。但是,当您单击编辑按钮时,values控制台中会显示正确的内容。在我的理解中,此时组件应该values根据表达式重新渲染并替换该值,{inputValues?.date ? inputValues.date : today} 但实际上,日历的值 = today,所有其他输入的值 = values。如果将表达式替换today为空字符串,那么当您调用编辑函数时,编辑表单中的日历值 = inputValues.date,但创建表单中的默认值现在为空,因为 today在这种情况下未指定。

此行为并非日历所独有,任何其他输入的行为方式相同,如果在表达式中,请将空字符串替换为任何值。如果您解释此行为以及如何解决它,我将非常高兴。

测试用例


    import React, { useState } from 'react';
    
    export default function Parent() {
      const [values, setValues] = useState();
      const change = () => setValues({ name: 'name', date: '2023-11-28' });
      return (
        <Child values={values} change={change} />
      );
    }
    
    function Child({ values, change }) {
      console.log(values);
      return (
        <div className="container">
          <button type="button" onClick={change} >clickMe</button>
          <input type="text" defaultValue={values?.name ? values.name : ''} />
          <input type="date" defaultValue={values?.date ? values.date : '2023-11-20'} />
        </div>
      );
    }

javascript
  • 1 1 个回答
  • 54 Views

1 个回答

  • Voted
  1. Best Answer
    ksa
    2023-11-28T16:19:31Z2023-11-28T16:19:31Z

    事实上,defaultValue它的行为很奇怪。

    我在网上查了一下,你不是唯一遇到这个问题的人。结果,他们提供了这个问题的“解决方案”。您需要为“有问题的”输入提供一个属性,key以便它在每次渲染时都会发生变化。那。元素开始响应其状态的变化defaultValue。

    //    
    function App() {
      const [values, setValues] = React.useState();
      const change = () => setValues({ name: 'name', date: '2023-11-28' });
      return (
        <Child values={values} change={change} />
      );
    }
    //
    function Child({ values = {}, change }) {
      console.log(values);
      const v1 = values.name ? values.name : ''
      const v2 = values.date ? values.date : '2023-11-20'
      const k = v2 ? v2 : (new Date()).toString()
      return (
        <div className="container">
          <button type="button" onClick={change} >clickMe</button>
          <input type="text" defaultValue={v1} />
          <input key={k} type="date" defaultValue={v2} />
        </div>
      );
    }
    
    const domContainer = document.querySelector('#like_button_container');
    const root = ReactDOM.createRoot(domContainer);
    root.render(<App />);
    <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
    <div id="like_button_container"></div>

    • 3

相关问题

  • 第二个 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