【问题标题】:How Can I change the property of components of React?如何更改 React 组件的属性?
【发布时间】:2020-11-01 16:49:27
【问题描述】:

我是 React 新手,最近开始研究它。我知道我们不能使用 props 更改组件属性。

我想知道如何更改组件的属性? 以下是我的代码:

Courses.jsx

function Courses(){


return (
    <div className="courses">
        <h1>Ongoing Courses</h1>
        <div className="row">
        
        {CourseData.map((value,index)=>{
            return   (
              
                  <div className="col-md-3">
                  <Card title={value.title}  completed={value.completed} content={value.content} value="Resume !" key={index} id={index} />
                  </div>
             
            );
        })}
    </div>
    </div>
);
}

在上面我有一个名为 courseData 的数据数组,我将它映射到 Card 组件上。

卡片.jsx:

function Card(props){

function handleClick(){
  
}
return (
    <div className="card">
        <div className="card-body">
            <h2 className="card-title">{props.title}</h2>
            {props.content}
            <br/>
        <button  className="btn btn-danger" > {props.value}</button>
        </div>
    </div>
);
}

CourseData 具有以下属性:

courseData : [{
key, 
title,
completed
content}]

我只是希望当出现的按钮是卡片时被点击,然后 courseData 的完成属性更改为通过道具传递的一些不同的值。

我尝试了很多,但做不到。

任何有关这方面的帮助都会对我有所帮助。

courseData.jsx:

const notes = [{
key: 1,
title: "some Text",
completed:false,
content: "some Text"
},
 {
    key: 2,
   title: "some Text",
completed:false,
content: "some Text"
 }]
export default notes;

【问题讨论】:

  • 你在哪里声明了CourseData?可以分享一下吗?
  • 嘿@Arnab courseData 就像 :const notes = [{ key: 1, title: "Delegation", completed:false, content: "Q. 换一盏灯需要多少程序员灯泡?A. 无 - 这是硬件问题" }, { key: 2, title: "Loops", completed:false, content: "如何让程序员永远洗澡。给他看洗发水瓶说明:起泡。冲洗。重复。” }]
  • CourseData 是状态变量吗?
  • 是的,我看到了,但是你在哪里声明的?是Courses.jsx的状态吗?
  • 你好,我在上面添加了 courseData.jsx 文件,你可以在那里看到。它是简单的数据数组文件。

标签: javascript reactjs react-component react-state


【解决方案1】:

将 CourseData 添加到 Courses 组件的状态。然后添加一个方法来调整那里的数据。通过在 Card 组件中单击按钮时将调用的 props 传递方法:

function Courses() {
  const [courseData, setCourseData] = useState(CourseData);
  const updateCourseData = (index) => {
    courseData.splice(index, 1);  
    setCourseData(courseData);
  }

  return (
    <div className="courses">
      <h1>Ongoing Courses</h1>
      <div className="row">
    
      {courseData.map((value,index)=>{
        return   (
          
              <div className="col-md-3">
              <Card title={value.title} updateCourseData={updateCourseData}  completed={value.completed} content={value.content} value="Resume !" key={index} id={index} />
              </div>
         
          );
      })}
      </div>
      </div>
   );
}

在 Card.jsx 中:

<button onClick={() => props.updateCourseData(props.id)}  className="btn btn-danger" > {props.value}</button>

【讨论】:

  • 嘿,这个解决方案对我不起作用。可以澄清更多,我们将如何使用它:- const updateCourseData = (item) => { //在此处更新课程数据 (newCourseData) 并更新状态然后 setCourseData(newCourseData); } 更新数据?
  • 我收到此错误 - t 分配给对象 '#' 的只读属性 'title' 我写了这个: - function updateCourseData(data){ data.title = "ye" ;设置课程数据(数据); }
  • 这真的取决于点击按钮后你想做什么。假设您需要删除该课程项目。那么你可以这样做:``` const updateCourseData = (index) => { courseData.splice(index, 1);设置课程数据(课程数据); } ``` 在 Card.jsx 中需要传递索引:onClick={() =&gt; props.updateCourseData(props.id)}
【解决方案2】:
function Courses(){
const [coursesData, setCoursesData] = useState(CourseData)

return (
    <div className="courses">
        <h1>Ongoing Courses</h1>
        <div className="row">
        
        {coursesData.map((value,index)=>{
            return   (
                  <div className="col-md-3">
                  <Card coursesData={coursesData}  setCoursesData={setCoursesData} title={value.title}  completed={value.completed} content={value.content} value="Resume !" key={index} id={index} />
                  </div>
            );
        })}
    </div>
    </div>
);
function Card({id,title,value,content,coursesData,setCoursesData }){

function handleClick(e){
  e.preventDefault()
  setCoursesData(coursesData => {
      const data = coursesData
      data.splice(id,1,{
          title: title,
          completed: value,
          content: content,
          key: id
      })
      return data
  })
}
return (
    <div className="card">
        <div className="card-body">
            <h2 className="card-title">{title}</h2>
            {content}
            <br/>
        <button onClick={handleClick} className="btn btn-danger">{value}</button>
        </div>
    </div>
);

【讨论】:

  • 当我单击按钮时,Card.jsx 中的 props.completed 的值会更改为下一个值,这样我就可以稍后将这个更改后的 courseData,jsx 值与某些函数一起使用卡.jsx 。我想现在应该很清楚了。
  • 您不能改变组件中的数据。这是一个不好的做法。我会将头部评论更新为工作版本
猜你喜欢
  • 2016-12-07
  • 1970-01-01
  • 2021-04-21
  • 2014-04-24
  • 2021-12-12
  • 2019-07-03
  • 2021-05-26
  • 2018-09-03
  • 2011-11-29
相关资源
最近更新 更多