react如何修改循环数组对象的数据

目录
  • 修改循环数组对象的数据
    • 问题描述
    • 解决办法
    • 案例说明
  • react使用循环并实现删除和修改
  • 总结

修改循环数组对象的数据

问题描述

做一个消息评论列表,针对具体某一个消息,里面有“收藏”和“点赞”功能,但是发现直接修改对象的树形,无法改变视图,因此做了笔记,方便后续学习

解决办法

循环遍历所有的对象,然后修改对应的值,重新设置 数组对象

案例说明

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数据
    state = {
        isEdit: false
    }

    // 异步获取 JS 普通对象,并绑定在props上当服务渲染时, 我是最先执行的声明周期函数  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'
                }
            ]
        };
    }

    // 构造函数, 我是 second
    constructor(props) {
        super(props);
        let {username} = this.props;
        console.log('huangbiao', username)
    }

    // 页面加载完了,设置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 () {
    }

    // 页面跳转到首页
    goHomePage () {
        Router.push('/profile');
    }

     // 收藏
    collectAction (messageObj, eventObj) {
        let { messageList } = this.state;
		// 循环遍历 state中的 数组对象
        let newListData = messageList.map(function(item, idx){
            if (item.id === messageObj.id) {
				// 改变值
                return {
                    ...item,
                    isCollect:  !messageObj.isCollect
                }
            } else {
                return item;
            }
        });
		// 变化之后的 JSON数组,重新赋值
        this.setState({
            messageList: newListData
        })
    }

    // 点赞
    complimentAction(messageObj, index, eventObj) {
        let { messageList } = this.state;
		// 修改具体数组对象中的值
        messageList[index]['isCompliment'] = !messageList[index]['isCompliment'];
		// 将修改后的数组对象克隆,然后再重新赋值
        // let newListData = JSON.parse(JSON.stringify(messageList));
        let newListData = messageList;
        this.setState({
            messageList: newListData
        })
    }

    // 获取用户的评论列表
    getMessageListHtml () {
        const that = this;
        let { messageList } = this.state;
        // 因为 messageList 是异步加载进来的,所以最开始,是undefined
        if (!messageList) {
            messageList = [];
        }
        return messageList.map(function(messageObj, index){
            return (
                <div className={styles['message-container']} key={messageObj.id}>
                    <div className={styles.portrait}>
                        [外链图片转存失败(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使用循环并实现删除和修改

在React当中如何使用for循环对当前的数据进行遍历:

这4个组件是自己一个个写进来的,因该根据数据的多少遍历出来对应的一个结果:

例如:遍历Persons时应该给我们返回一个对应的组件,而不是有一个写一个

在React中遍历需要使用正常的js语法(对应的逻辑要写在花括号里面)

解决此问题:添加key值属性,key里面必须有独一的标识

这样就给每一个元素标出了key值;

既然现在有用了下标,就可以给当前的组件添加对应的事件,比如现在添加删除的事件,点击某一个东西可以删除掉;

上述代码需要调整的地方,因为在React当中都在使用ES6的语法,ES6提供了一个操作运算符,如果后期往数组里面添加东西就会非常方便:

还有需要做的事情就是更改当前组件的一个内容:

这之前给person的每个对象赋一个id属性

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • React函数组件和类组件的区别及说明

    目录 React函数组件和类组件区别 函数组件 类组件 区别 React函数式组件和类组件的优缺点 1.类组件的性能消耗比较大 2.函数式组件性能消耗小 React函数组件和类组件区别 定义组件有两个要求: 组件名称必须以大写字母开头 组件的返回值只能有一个根元素 函数组件 function Welcome (props) {   return <h1>Welcome {props.name}</h1> } ReactDOM.render(<Welcome name='rea

  • React实现点击删除列表中对应项

    点击删除按钮,删除列表中对应项本来是React比较基础的应用,可是应用情况变得复杂了以后,我还真想了一会儿才搞定. 简化一下应用场景:点击新增按钮,增加一条输入框,点击输入框旁边的按钮,删除该输入框(不能删错了啊). 先说第一种方法 问题刚上手,首先规划级别:一个输入框和对应删除按钮为一个子组件,整体为父组件即可方便处理. 注意的点:生成的一坨输入框是一个数组,为了准确删掉对应项,生成时要编号.点击删除按钮要反馈对应编号,然后进行删除. 现在的逻辑是:整个待展示列表(由子组件组成的数组)是个st

  • react如何修改循环数组对象的数据

    目录 修改循环数组对象的数据 问题描述 解决办法 案例说明 react使用循环并实现删除和修改 总结 修改循环数组对象的数据 问题描述 做一个消息评论列表,针对具体某一个消息,里面有“收藏”和“点赞”功能,但是发现直接修改对象的树形,无法改变视图,因此做了笔记,方便后续学习 解决办法 循环遍历所有的对象,然后修改对应的值,重新设置 数组对象 案例说明 import * as React from 'react'; import { Icon, Button, Input, Form, } fro

  • vue.js基于v-for实现批量渲染 Json数组对象列表数据示例

    本文实例讲述了vue.js基于v-for实现批量渲染 Json数组对象列表数据.分享给大家供大家参考,具体如下: Vuejs的出现减轻了对DOM的直接操作,同时它提供的 v-for 渲染列表数据也给我们提供了很大的方便.即使是复杂的 Json数组对象,也可以使用 多层嵌套的 v-for 实现,格式如下: <div v-for="(item,index) in items"> <div v-for="(list,index) in item.lists&quo

  • 使用react在修改state中的数组和对象数据的时候(setState)

    目录 react修改state的数组和对象数据的时候(setState) 需要注意 react修改数组对象的注意事项 删除数组中的指定元素 合并两个对象 修改多层级对象的值 react修改state的数组和对象数据的时候(setState) 首先在修改状态数据(state)的时候,我们要遵循react的规则,使用setState()方法去修改 此时修改的数据是一个数组或者是一个对象的时候,setState中传递一个对象是不能够满足的,此时就需要给setState中传递函数了! 此时函数中的参数s

  • React修改数组对象的注意事项及说明

    目录 React修改数组对象问题 React修改数组中某个参数值方法 React修改数组对象问题 react开发主张使用函数式编程,函数式编程有个重要的特性就是不可变性. 你无法更改数据,也不能更改. 如果要改变或更改数据,则必须复制数据副本来更改. 看个例子,就是Vue和React两个框架实现给数组添加一个元素. vue export default {     name: "home",     data() {         return {             testA

  • vue中的循环遍历对象、数组和字符串

    目录 vue循环遍历对象.数组和字符串 1.循环遍历对象 2.循环遍历数组 3.循环遍历字符串 vue循环遍历,指令v-for 1.循环遍历 2.v-for遍历数组 3.v-for遍历对象 4.v-for使用中添加key vue循环遍历对象.数组和字符串 1.循环遍历对象 1.1vue 在html里面循环遍历对象 v-for=" (val, key , i) in dimItemMap" :key="key" val-每一项 key -key值 i-第几个 <

  • vue forEach循环数组拿到自己想要的数据方法

    如下所示: <el-checkbox v-for="(item) in jurisdictionContent" :label="item.id" :key="item.id" class="checkboxMargin"> <span>{{item.value}}{{item.checked}}</span> </el-checkbox> handleJurisdiction(

  • react实现无限循环滚动信息

    本文实例为大家分享了react实现无限循环滚动信息的具体代码,供大家参考,具体内容如下 需求 后端传递过来的数据滚动显示,鼠标移入后停止滚动,鼠标移出后继续滚动,参考公司门户的公告信息栏 实现思路 思路一 在componentDidMount中定义一个定时器,每过1000ms触发一次事件,将数组中第一条数据push到数组中,再删除掉第一条数据,最后给div添加onMouEnter和onMouseLeave事件,让鼠标移入时清除定时器,鼠标移出时重新开启定时器. 代码: class Roll ex

  • Vue 对象和数据的强制更新方式

    目录 对象和数据的强制更新 数组更新 强制更新 更新数据并强制更新视图 对象类型 数组类型 异步类型 强制更新 对象和数据的强制更新 数组更新 以下支持自动更新 push() //向后添加 pop() //删除最后一个 shift() //删除第一个 unshift() //向第一个添加元素 splice() //向指定位置添加/删除元素 sort() //用原地算法对数组的元素进行排序 reverse() //将数组中元素的位置颠倒 注意,这种形式修改数据 this.arr[1] = ‘x’

  • javascript之Array 数组对象详解

    1.创建Array对象方法: --->var arr = [element0, element1, ..., elementn];//简单的定义方法 复制代码 代码如下: var arr = [1,2,3] 此时可以知道 复制代码 代码如下: arr[0] == 1; arr[1] == 2; arr[2] == 3; --->new Array(); 复制代码 代码如下: var arr = new Array();//定义一个没有任何内容的数组对象,然后以下面的方式为其赋值 arr[0]

  • 全面总结Javascript对数组对象的各种操作

    数组 数组定义:简而言之就是一组有序的数据集合,其索引为从0开始且自然增长的整数,其元素值可以是任何js数据!并且包含一个名为length的属性,该属性表示数组元素的个数! 一.定义数组,有三种定义方式: 方式一: var arr=new Array(); arr[0]="11"; arr[1]="22"; arr[2]="33"; 方式二: var arr=new Array("11","22",&quo

随机推荐