react如何修改循環(huán)數(shù)組對象的數(shù)據(jù)
react修改循環(huán)數(shù)組對象的數(shù)據(jù)
問題描述
做一個消息評論列表,針對具體某一個消息,里面有“收藏”和“點贊”功能,但是發(fā)現(xiàn)直接修改對象的樹形,無法改變視圖,因此做了筆記,方便后續(xù)學(xué)習(xí)
解決辦法
循環(huán)遍歷所有的對象,然后修改對應(yīng)的值,重新設(shè)置 數(shù)組對象
案例說明
import * as React from 'react';
import {
Icon,
Button,
Input,
Form,
} from 'antd';
import styles from './userinfo.less';
import logo from '/static/logo.svg';
import Connection from '@/store';
import Router from 'next/router';
// @ts-ignore
@Connection(({albums, loading}) => ({
albums: albums,
loading: loading.effects['_user/login'],
}))
export default class UserInfo extends React.Component {
// 定義state數(shù)據(jù)
state = {
isEdit: false
}
// 異步獲取 JS 普通對象,并綁定在props上當(dāng)服務(wù)渲染時, 我是最先執(zhí)行的聲明周期函數(shù) first
static async getInitialProps(props) {
// 后面我來添加promise來模擬ajax請求,暫時讓你更容易理解
return {
username: 'Yijun Liu',
address: 'USA. University of San Francisco',
major: 'Computer Scientis',
email: 'zhangsan@163.com',
"messageList": [
{
id: 1,
email: 'Yijun Liu@163.com',
message: 'Just setting up my Twitter.111111',
date: '2019-5-18 11:33:56'
},
{
id: 2,
email: 'Yijun Liu@163.com',
message: 'Just setting up my Twitter.222222',
date: '2019-5-18 11:33:56'
},
{
id: 3,
email: 'Yijun Liu@163.com',
message: 'Just setting up my Twitter.333333',
date: '2019-5-18 11:33:56'
}
]
};
}
// 構(gòu)造函數(shù), 我是 second
constructor(props) {
super(props);
let {username} = this.props;
console.log('huangbiao', username)
}
// 頁面加載完了,設(shè)置body的背景色 我是 Third
componentDidMount () {
document.getElementsByTagName('body')[0].style.background = '#E7ECEF';
let {username, address, major, email, messageList} = this.props;
console.log('huangbiao', username)
this.setState({
"username": username,
"address": address,
"major": major,
"email": email,
"messageList": messageList
})
}
// 離開頁面處理的邏輯 我是 Last
componentWillUnmount () {
}
// 頁面跳轉(zhuǎn)到首頁
goHomePage () {
Router.push('/profile');
}
// 收藏
collectAction (messageObj, eventObj) {
let { messageList } = this.state;
// 循環(huán)遍歷 state中的 數(shù)組對象
let newListData = messageList.map(function(item, idx){
if (item.id === messageObj.id) {
// 改變值
return {
...item,
isCollect: !messageObj.isCollect
}
} else {
return item;
}
});
// 變化之后的 JSON數(shù)組,重新賦值
this.setState({
messageList: newListData
})
}
// 點贊
complimentAction(messageObj, index, eventObj) {
let { messageList } = this.state;
// 修改具體數(shù)組對象中的值
messageList[index]['isCompliment'] = !messageList[index]['isCompliment'];
// 將修改后的數(shù)組對象克隆,然后再重新賦值
// let newListData = JSON.parse(JSON.stringify(messageList));
let newListData = messageList;
this.setState({
messageList: newListData
})
}
// 獲取用戶的評論列表
getMessageListHtml () {
const that = this;
let { messageList } = this.state;
// 因為 messageList 是異步加載進(jìn)來的,所以最開始,是undefined
if (!messageList) {
messageList = [];
}
return messageList.map(function(messageObj, index){
return (
<div className={styles['message-container']} key={messageObj.id}>
<div className={styles.portrait}>
[外鏈圖片轉(zhuǎn)存失敗(img-aFNgwwai-1562046300900)(https://mp.csdn.net/static/logo.png)]
</div>
<div className={styles['info-container']}>
<div className={styles.author}>
{messageObj.email}
</div>
<div className={styles.theme}>
{messageObj.message}
</div>
<div className={styles.time}>
{messageObj.date}
<div className={styles['tool-bar']}>
<div className={styles['bar-btn']}>
{/* 點贊 */}
{
messageObj.isCompliment ?
<Icon type="heart" onClick={that.complimentAction.bind(that, messageObj, index)} style={{color: 'red'}} />
: <Icon type="heart" onClick={that.complimentAction.bind(that, messageObj, index)}/>
}
</div>
<div className={styles['bar-btn']}>
<Icon type="message" onClick={that.collectAction.bind(that, messageObj)}/>
</div>
<div className={styles['bar-btn']}>
{/* 收藏 */}
{
messageObj.isCollect ?
<Icon type="star" onClick={that.collectAction.bind(that, messageObj)} style={{color: '#FEC603'}} />
: <Icon type="star" onClick={that.collectAction.bind(that, messageObj)}/>
}
</div>
</div>
</div>
</div>
</div>
);
})
}
render() {
let messageListHtml = this.getMessageListHtml();
return (
<div className={styles['userinfo-page']}>
<div className={styles['main-container']}>
<div className={styles['main-center']}>
{messageListHtml}
</div>
</div>
</div>
);
}
}
react使用循環(huán)并實現(xiàn)刪除和修改
在React當(dāng)中如何使用for循環(huán)對當(dāng)前的數(shù)據(jù)進(jìn)行遍歷:
這4個組件是自己一個個寫進(jìn)來的,因該根據(jù)數(shù)據(jù)的多少遍歷出來對應(yīng)的一個結(jié)果:

例如:遍歷Persons時應(yīng)該給我們返回一個對應(yīng)的組件,而不是有一個寫一個

在React中遍歷需要使用正常的js語法(對應(yīng)的邏輯要寫在花括號里面)


解決此問題:添加key值屬性,key里面必須有獨一的標(biāo)識

這樣就給每一個元素標(biāo)出了key值;
既然現(xiàn)在有用了下標(biāo),就可以給當(dāng)前的組件添加對應(yīng)的事件,比如現(xiàn)在添加刪除的事件,點擊某一個東西可以刪除掉;

上述代碼需要調(diào)整的地方,因為在React當(dāng)中都在使用ES6的語法,ES6提供了一個操作運算符,如果后期往數(shù)組里面添加?xùn)|西就會非常方便:

還有需要做的事情就是更改當(dāng)前組件的一個內(nèi)容:

這之前給person的每個對象賦一個id屬性

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決react中useState狀態(tài)異步更新的問題
本文主要介紹了react中useState狀態(tài)異步更新的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
淺析JS中什么是自定義react數(shù)據(jù)驗證組件
我們在做前端表單提交時,經(jīng)常會遇到要對表單中的數(shù)據(jù)進(jìn)行校驗的問題。這篇文章主要介紹了js中什么是自定義react數(shù)據(jù)驗證組件,需要的朋友可以參考下2018-10-10
React替換傳統(tǒng)拷貝方法的Immutable使用
Immutable.js出自Facebook,是最流行的不可變數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)之一。它實現(xiàn)了完全的持久化數(shù)據(jù)結(jié)構(gòu),使用結(jié)構(gòu)共享。所有的更新操作都會返回新的值,但是在內(nèi)部結(jié)構(gòu)是共享的,來減少內(nèi)存占用2023-02-02
Taro?React自定義TabBar使用useContext解決底部選中異常
這篇文章主要為大家介紹了Taro?React底部自定義TabBar使用React?useContext解決底部選中異常(需要點兩次才能選中的問題)示例詳解,有需要的朋友可以借鑒參考下2023-08-08
react-player實現(xiàn)視頻播放與自定義進(jìn)度條效果
本篇文章通過完整的代碼給大家介紹了react-player實現(xiàn)視頻播放與自定義進(jìn)度條效果,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-01-01

