我有一个问题,我试图点击某个由我的后端返回的div并更新它.我正在try 设置它,这样你点击编辑,博客标题和博客正文就会变成输入栏,你可以在其中输入新标题和新正文.在我的代码中,你可以看到一个有效的更新和一个无效的更新.问题是,当我点击编辑时,所有blogBody和blogTitle都变成了输入栏,而不是一个.

video期的这5秒可能比我的解释更有意义.

在我的代码中,这主要涉及以下内容:

<div style={{display : 'flex', flexDirection: 'column-reverse'}}>
    { getBasic.miscData.map(({blogBody, blogTitle, _id}, i) => {
        return(
      <div key={i} >
        <p>{i}</p>
        {prompt ? <p>{blogBody}</p> : <input  onChange={handleChange} name='newerValue' value={Item.newerValue}  placeholder='new title'></input>}
        {prompt ? <p>{blogTitle}</p> : <input  onChange={handleChange} name='newerValue2' value={Item.newerValue2}  placeholder='new title'></input>}
        <p>{blogTitle}</p>
        <p>{_id}</p>

        <button onClick={deleteOne} value={_id}>Delete</button>

        {prompt ? <button onClick={() => { setPrompt(!prompt)}} >Edit</button> : <button onClick={() => { setPrompt(!prompt)}} >Submit</button>}
        
      </div>

以下是完整的代码:

import './App.css';
import axios from 'axios';
import React, { useState, useEffect } from 'react'

function App() {

  const [getBasic, setGetBasic] = useState()
 
  const [Item, setItem] = useState(
    {
      title: '',
      description: '',
      id: '',
      newValue: '',
      newValue2: '',
      newerValue: '',
      newerValue2: '',
      previousValue: ''
    }
  )

  const [prompt, setPrompt] = useState(true)




  async function fetchData() {
    await axios.get('http://localhost:3001/api')
    .then(result => setGetBasic(result.data))

  }



  function handleChange(event) {
    let {name, value} = event.target;
    setItem(prevInput => {
      return(
        {
          ...prevInput,
          [name]: value,
        }
      );
    });
    // console.log(Item);
  }



  //delete
  function deleteOne(event) {
    event.preventDefault();
    const aValue = event.target.value;
    const deleteItem = {
      // id: Item.id
      id: aValue
    }
    console.log(deleteItem)

    axios.post('http://localhost:3001/api/delete', deleteItem);
    window.location.reload();
    // console.log(deleteItem)

  }


  function updateOne(event) {
    event.preventDefault();
    const updatedItem = {
      previousValue: Item.previousValue,
      newValue: Item.newValue,
      newValue2: Item.newValue2
    }
    console.log(updatedItem)

    axios.put('http://localhost:3001/api/update', updatedItem);
    window.location.reload();
    // console.log(deleteItem)


  }






  useEffect(() => {
    fetchData()
  }, [])

  if (getBasic) {
  
  return (
    <div className="App">
      



      <br />
      {/* A version of update that works */}
      <input  onChange={handleChange} name="previousValue" value={Item.previousValue} placeholder="old value id" />
      <input  onChange={handleChange} name='newValue' value={Item.newValue}  placeholder='new title'></input>
      <input  onChange={handleChange} name='newValue2' value={Item.newValue2}  placeholder='new body'></input>
      <button onClick={updateOne} >update</button>


      {/* A version of update that does not work*/}
    <div style={{display : 'flex', flexDirection: 'column-reverse'}}>
    { getBasic.miscData.map(({blogBody, blogTitle, _id}, i) => {
        return(
      <div key={i} >
        <p>{i}</p>
        {prompt ? <p>{blogBody}</p> : <input  onChange={handleChange} name='newerValue' value={Item.newerValue}  placeholder='new title'></input>}
        {prompt ? <p>{blogTitle}</p> : <input  onChange={handleChange} name='newerValue2' value={Item.newerValue2}  placeholder='new title'></input>}
        <p>{blogTitle}</p>
        <p>{_id}</p>

        <button onClick={deleteOne} value={_id}>Delete</button>

        {prompt ? <button onClick={() => { setPrompt(!prompt)}} >Edit</button> : <button onClick={() => { setPrompt(!prompt)}} >Submit</button>}
        
      </div>
      )})}
      </div>
    
     
    </div>
  )} else {
    return (
      <div>
        <h1>Loading</h1>
        
      </div>
    )
  };
}

export default App;

现在我明白了为什么它会这样做,我只是无法思考让我的编辑按钮一次只编辑一个按钮的逻辑.此外,我明白一旦我解决了这个问题,更新将无法工作,我正在try 解决这个问题,即在设置另一个更新之前,先一次编辑1.

编辑:到目前为止,我收到了一个不喜欢的 comments ,我重新阅读了这篇文章,并意识到它缺乏一点重点,因此代码更简单:

import './App.css';
import axios from 'axios';
import React, { useState, useEffect } from 'react'

function App() {

  const [getBasic, setGetBasic] = useState()
 
  const [Item, setItem] = useState(
    {
      title: '',
      description: '',
      id: '',
      newerValue: '',
      newerValue2: '',
      previousValue: ''
    }
  )

  const [prompt, setPrompt] = useState(true)



  async function fetchData() {
    await axios.get('http://localhost:3001/api')
    .then(result => setGetBasic(result.data))
    console.log(getBasic)
  }



  useEffect(() => {
    fetchData()
  }, [])

  if (getBasic) {
  
  return (
    <div className="App">

    <div style={{display : 'flex', flexDirection: 'column-reverse'}}>
    { getBasic.miscData.map(({blogBody, blogTitle, _id}, i) => {
        return(
      <div key={i} >
        <p>{i}</p>
        {prompt ? <p>{blogBody}</p> : <input  ></input>}
        {prompt ? <p>{blogTitle}</p> : <input ></input>}
        <p>{blogTitle}</p>
        <p>{_id}</p>


        {prompt ? <button onClick={() => { setPrompt(!prompt)}} >Edit</button> : <button onClick={() => { setPrompt(!prompt)}} >Submit</button>}
        
      </div>
      )})}
      </div>
    
     
    </div>
  )} else {
    return (
      <div>
        <h1>Loading</h1>
        
      </div>
    )
  };
}

export default App;

这就是解决当前问题所需的全部工作,即一次编辑一个,而不是全部编辑.留下op作为参考.

推荐答案

每个元素都有一个组件,这样每个元素都有自己独特的prompt

例如

//元素.js

import React from "react";

export default function Element({
  i,
  blogTitle,
  handleChange,
  _id,
  deleteOne,
  blogBody,
  Item
}) {
  const [prompt, setPrompt] = React.useState(true);

  return (
    <div>
      <p>{i}</p>
      {prompt ? (
        <p>{blogBody}</p>
      ) : (
        <input
          onChange={handleChange}
          name="newerValue"
          value={Item.newerValue}
          placeholder="new title"
        ></input>
      )}
      {prompt ? (
        <p>{blogTitle}</p>
      ) : (
        <input
          onChange={handleChange}
          name="newerValue2"
          value={Item.newerValue2}
          placeholder="new title"
        ></input>
      )}
      <p>{blogTitle}</p>
      <p>{_id}</p>

      <button onClick={deleteOne} value={_id}>
        Delete
      </button>

      {prompt ? (
        <button
          onClick={() => {
            setPrompt(!prompt);
          }}
        >
          Edit
        </button>
      ) : (
        <button
          onClick={() => {
            setPrompt(!prompt);
          }}
        >
          Submit
        </button>
      )}
    </div>
  );
}

//应用程序.js

Now in the body return of your main file you could just do this

首先导入import Element from "./Element";,然后添加具有指定props 的新组件

    {getBasic.miscData.map(({ blogBody, blogTitle, _id }, i) => {
        return (
          <Element
            i={i}
            blogTitle={blogTitle}
            handleChange={handleChange}
            _id={_id}
            deleteOne={deleteOne}
            blogBody={blogBody}
            Item={Item}
          />
        );
      })}

Javascript相关问答推荐

一次仅播放一个音频

如何在不分配整个数组的情况下修改包含数组的行为主体?

ReactJS中的material UI自动完成类别

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

Angular:动画不启动

Chromium会将URL与JS一起传递到V8吗?

处理时间和字符串时MySQL表中显示的日期无效

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

如何限制显示在分页中的可见页面的数量

将相关数据组合到两个不同的数组中

在渲染turbo流之后滚动到元素

如何使用抽屉屏幕及其子屏幕/组件的上下文?

使用Reaction窗体挂钩注册日历组件

我不知道如何纠正这一点.

输入数据覆盖JSON文件

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

react :图表负片区域不同 colored颜色

如何在preLoad()中自定义p5.js默认加载动画?

try 导入material 时出现错误NG0203