如何在 React(Next.js) 中分别控制每个属性?

Posted

技术标签:

【中文标题】如何在 React(Next.js) 中分别控制每个属性?【英文标题】:How do I control each property respectively in React(Next.js)? 【发布时间】:2022-01-21 00:00:32 【问题描述】:
import React from 'react';
import  makeStyles from '@material-ui/core/styles';
import Select, MenuItem from '@material-ui/core';
import useState from 'react';

const test = () => 

const data = [
TITLE : "Festival", PRIORITY : 3, STEP : 1,
TITLE : "Headphone", PRIORITY : 2, STEP : 2,
TITLE : "Mountain", PRIORITY : 1, STEP : 1
]

return (
<>

data.map((info) => (
<div>

<div>info.TITLE</div>

<Select value=info.PRIORITY>
  <MenuItem value=1> 1 </MenuItem>
  <MenuItem value=2> 2 </MenuItem>
  <MenuItem value=3> 3 </MenuItem>
</Select>

<Select value=info.STEP>
  <MenuItem value=1> 1 </MenuItem>
  <MenuItem value=2> 2 </MenuItem>
  <MenuItem value=3> 3 </MenuItem>
</Select>

</div>
))

</>
)

export default test;

在这段代码中,我试图分别控制 PRIORITY 值和 STEP 值。

我遇到了麻烦,因为在我的数据数组中,我有三个项目。因此,如果我添加

const [priority, setPriority] = useState(undefined);
const [step, setStep] = useState(undefined);

const priorityChange = (e) => 
  setPriority(e.target.value)
;

const stepChange = (e) => 
  setStep(e.target.value)
;

并将这个值放入

<Select value=priority onChange=priorityChange></Select>
...

<Select value=step onChange=stepChange></Select>
...

这个项目,

每个项目都有相同的值,因此我无法控制每个 PRIORITY 和 STEP 值。

如何控制每个项目?我需要一些帮助。

我可能拼错了。请理解!

【问题讨论】:

你能在codesandbox.io 上提供一个最小的例子吗?有点难理解 @TusharShahi 好的。我正在努力。 @TusharShahi codesandbox.io/s/inspiring-kirch-38fil?file=/src/App.js 这里! 嘿亚丁,谢谢。但是您的示例没有 onchange 函数,因此我们看不到问题所在 @TusharShahi 如果您阅读了我的描述,您就会知道为什么我没有在每个选择标签上给出 onChange 事件! 【参考方案1】:

首先,您的data 数组没有与任何状态管理变量挂钩。因此,当您尝试最初显示数据数组中的值,然后尝试在触发操作时显示来自 hooks 变量的更新数据时,很明显会导致一些冲突,因此无法显示更新的值。解决此问题的一种方法是将初始数据与状态挂钩相关联,然后相应地更新 data 数组。更新与触发的操作相对应的正确数据也很重要,因此在这里我们要确保集合的每个对象都是唯一的,这可以通过为每个对象分配 id 属性来实现。更进一步,我们可以找出执行操作的对象,改变属性值,然后使用状态钩子函数重新构造数组,以使用正确的更新值重新渲染。 请参考以下代码并阅读 cmets 以获得更清晰的概念。

import React,  useState  from "react";
const App = () => 
  const [data, setData] = useState([
     id: Math.random(), TITLE: "Festival", PRIORITY: 3, STEP: 1 ,
     id: Math.random(), TITLE: "Headphone", PRIORITY: 2, STEP: 2 ,
     id: Math.random(), TITLE: "Mountain", PRIORITY: 1, STEP: 1 
  ]); //id attribute is added to each object to make sure every object in the array is unique.

  const priorityChange = (e, id) => 
   //This function should accept event and id arguments, to identify and update 
   //values correctly.
    const index = data.findIndex((item) => item.id === id); //find the index of the object (item) whose priority needs to be updated.
    const arr = [...data]; //Copy original array data to constant arr.

    arr[index].PRIORITY = e.target.value; //mutate the PRIORITY property's value

    setData([...arr]); //Set data to the new array with updated value.

    
  ;

  const valueChange = (e,id) => 
    //This function should accept event and id arguments, to identify and update 
   //values correctly.
    const index = data.findIndex((item) => item.id === id); //find the index of the object (item) whose priority needs to be updated.
    const arr = [...data];

    arr[index].STEP = e.target.value; //mutate the STEP property's value

    setData([...arr]); //Set data to the new array with updated value.
  ;
  return (
    <>
      data.map((info) => (
        <div key=Math.random()>
          <div>info.TITLE</div>

          <select
            value=info.PRIORITY
            onChange=(e) => 
              priorityChange(e, info.id); //pass event object and id corresponding to each array object.
            
          >
            <option value=1> 1 </option>
            <option value=2> 2 </option>
            <option value=3> 3 </option>
          </select>

          <select
            value=info.STEP
            onChange=(e) => 
              valueChange(e, info.id); //pass event object and id corresponding to each array object.
            
          >
            <option value=1> 1 </option>
            <option value=2> 2 </option>
            <option value=3> 3 </option>
          </select>
        </div>
      ))
    </>
  );
;

export default App;

【讨论】:

以上是关于如何在 React(Next.js) 中分别控制每个属性?的主要内容,如果未能解决你的问题,请参考以下文章

当父组件在 Next.js 应用程序中更新其道具时重新渲染 React 子组件

如何在 React、Next.js 中使用 tailwind.css 垂直和水平放置内容中心?

如何在 Next.js/React 中使用带有 @prismicio/client 库的时间线参考

如何在 next.js 中覆盖 react-skylight min-height?

如何在 Next.js 中使用带有顺风 css 的 React Suite?

在 Next.js 中,如何使用来自 getServerSideProps 的数据更新 React Context 状态?