我正在创建一个带有描述、优先顺序和日期的待办事项 list .我通过使用调用{inputChanged}的Textfield来获取优先级和描述.{InputChanged}设置todo.Description和todo.first,并且datepicker的{handleDateChange}函数应将todo.date作为字符串插入到状态中.在此之后,按下一个按钮将调用{addTodo},它会将整个待办事项状态添加到[待办事项]状态数组中,然后我可以在其中显示和删除项目.我能够显示其中的2个,并删除项目没有问题.

但是,我不知道如何使用DesktopDatePickers值在{inputChanged}函数之外设置todo.date.我可以将{selectedDate.toString()}登录到控制台,并以"清华,2022年11月24日22:00:00 GMT"的格式获得一个值(基于我 Select 的日期、月份和年份),但我也不知道如何将其添加为todo.date.

而且,每当第一次从这两个文本字段中读取输入时,都会收到一条警告:"一个组件正在将非受控输入更改为受控".我在谷歌上搜索了几次,但认为这是因为初始状态设置错误,或者与试图仅更改3个TODO状态对象中的2个有关.此警告似乎不会影响功能,因为它警告的代码部分仍按预期运行,但与此相关的提示也值得赞赏.

希望这其中的一些内容是有意义的,因为您可以从下面的解释和代码中看出,我是一个初学者,一些代码片段可以工作,但老实说,我不能把它们的功能教给任何人.感谢您提前给我所有的答复.(我已经决定排除进口产品,但我确信不是进口产品导致了这个问题.)

function Todolist() {
  const [todo, setTodo] = useState({description: '', date: '', priority:''});
  const [todos, setTodos] = useState([]);
  const gridRef = useRef();

  const inputChanged = (event) => {
    setTodo({...todo, [event.target.name]: event.target.value});
  }
  const addTodo = (event) => {
    setTodos([...todos, todo]);
    console.log(selectedDate)
  }
  const deleteTodo = () => {
    if (gridRef.current.getSelectedNodes().length > 0){
    setTodos(todos.filter((todo, index) =>
      index !== gridRef.current.getSelectedNodes()[0].childIndex))
  } else {
    alert('Select row first')
  }
}
  const columns = [
    {headerName: 'Date', field: 'date', sortable:true, filter: true, floatingFilter: true },
    {headerName: 'Description', field: 'desc', sortable:true, filter: true, floatingFilter: true },
    {headerName: 'Priority', field: 'prio', sortable: true, filter: true, floatingFilter: true}
   ]
  const [selectedDate, setSelectedDate] = useState(null)

  const handleDateChange = (newValue)=>{
    setSelectedDate(newValue)
        console.log(selectedDate)        
  }
  
  return (    
    <div className='App'>
      <LocalizationProvider dateAdapter={AdapterDayjs}>
      <TabApp/>
        <Stack direction="row" spacing={2} justifyContent="center" alignItems="center">

          <DesktopDatePicker
            views={["day", "month","year"]}
            label="Date"
            inputFormat="MM/DD/YYYY"
            value={selectedDate}
            onChange={handleDateChange}
            renderInput={(params) => <TextField {...params} />}
            name="date"
            />
              
            <TextField
              label="Description"
              variant="standard"
              name="desc" value={todo.desc}
              onChange={inputChanged}
              />
            <TextField
              label="Priority"
              variant="standard"
              name="prio" value={todo.prio}
              onChange={inputChanged}
              />

            <Button onClick={addTodo} variant="contained">Add</Button>
            <Button onClick={deleteTodo} variant="contained">Delete</Button>
        </Stack>
      </LocalizationProvider>
              

      <div
      className="ag-theme-material"
      style={{
        height: '700px',
        width: '80%',
        margin: 'auto'
      }}
      >
        <AgGridReact
        animateRows={true}
        ref={gridRef}
        onGridReady = {params => gridRef.current = params.api}
        rowSelection='single'
        columnDefs={columns}
        rowData={todos}>
        </AgGridReact> 
      </div> 
    </div>
  );
};

我try 了几种解决方案,大多数都归结为找到一种方法来设置Todo.date. 我try 的一种方法是基于{inputChanged}的功能

const handleDateChange = (newValue)=>{
    setSelectedDate(newValue.toString())
    setTodo({...todo, [todo.date]: selectedDate})      
  }

这不会导致错误,但在调用sole.log(Todo)时会看到以下内容: "":空 日期:"" 描述:"ASD" 描述:"" PRIO:"ASD" 优先级:"" 老实说,我不知道这是什么意思,除了值被打印了两次,第一个"日期"就是空的.

推荐答案

目前,当您运行此行时:

setTodo({...todo, [todo.date]: selectedDate});

它try 获取todo.date(其中是一个空字符串)的值作为键,然后将该值(SeltedDate)赋给键("").

为了解决这个问题,您应该像这样自己给出密钥:

const handleDateChange = (newValue)=> {
    const newSelectedDate = newValue.toString();
    setSelectedDate(newSelectedDate)
    setTodo({...todo, date: newSelectedDate})      
}

还有这个警告:"一个组件正在将非受控输入更改为受控",这是因为seltedDate的初始值为空.将其更改为"(new date()).toString()"将修复您的警告.

const [selectedDate, setSelectedDate] = useState((new Date()).toString());

Javascript相关问答推荐

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

如何找出摆线表面上y与x相交的地方?

TypeScript索引签名模板限制

将旋转的矩形zoom 到覆盖它所需的最小尺寸&S容器

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

用于编辑CSS样式的Java脚本

如何将react—flanet map添加到remixjs应用程序

Html文件和客户端存储的相关问题,有没有可能?

使用ThreeJ渲染的形状具有抖动/模糊的边缘

本地库中的chartjs-4.4.2和chartjs-plugin-注解

从另一个数组中的对应行/键值对更新数组中的键值对对象

处理TypeScrip Vue组件未初始化的react 对象

Node.js API-queryAll()中的MarkLogic数据移动

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

如何在加载页面时使锚定标记成为焦点

更改管线时不渲染组件的react

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但GET:Object.在Reaction项目中

webpack 5和mini-css-extract-plugin在将scss保存到css文件后不加载css

我在从侧面到内部的react 中面临着推翻观点的问题