1. 程式人生 > >React 動態增加,刪除,上下移動dom

React 動態增加,刪除,上下移動dom

思想

在react的世界裡,都是狀態變更(資料變更)來驅動dom變化,動態新增dom不像以前用jquery一樣append一個<li>或者一個<td> 這樣了,而是通過裝載<li> 或者<td> 資料陣列[]來動態新增dom,下面的例子實現使用了antd的元件庫
參考:https://ant.design/components/form-cn/#components-form-demo-dynamic-form-item

例項

這裡寫圖片描述

實現

1.引用

import React, { Component, PropTypes } from
'react'; import { Form, Input, Radio, Row, Col, Upload, Icon, Button, message, Select, DatePicker,Modal} from 'antd';

2.初始化

constructor(props) {
      super(props);
       this.state = {
           hover: [],
       };
}

3.內容元件
內容元件其實是一個<ul><li> ,遍歷了一個<li>的陣列articleContent,CSS樣式見最後

render(){

const liClass = this.state.hover[index] ? "rectanglesON " : "rectanglesOFF ";
const formItems = this.state.articleData.articleContent.map((k, index) => {
return (
<li key={index} ref={"li_" + index} datatype={k.contentType} className={liClass} onMouseEnter={this.handleMouseEnter.bind(this
,index)} onMouseLeave{this.handleMouseLeave.bind(this,index)} onClick={this.handleClickByModule.bind(this,index,k.contentType)}> //業務需要顯示的東西 <div>li標籤裡要顯示的東西</div> //懸停時右下角的按鈕 <div className={this.state.hover[index]?'actionShow':'actionHide'}> <div className={(index > 0)?'domShow':'domHide'}> <Button type="primary" size="small" className="mr-5" onClick={this.handleClickBySortUp.bind(this,index)}><Icon type="caret-up" />上移</Button> </div> <div className={(index < this.state.articleData.articleContent.length - 1)?'domShow':'domHide'}> <Button type="primary" size="small" className="mr-5" onClick={this.handleClickBySortDown.bind(this,index)}><Icon type="caret-down" />下移</Button> </div> <div> <Button type="primary" size="small" className="mr-5" onClick={this.handleClickByDelete.bind(this,index)}><Icon type="delete" />刪除</Button> </div> </div> </li> ) }); //ul return ( <FormItem label="內容"> <ul className='listContent'> {formItems} </ul> </FormItem> ) }

4.事件

//滑鼠移到內容模組上時觸發的事件
    handleMouseEnter(key) {
        let arg = this.state.hover;
        arg[key] = true;
        this.setState({
            hover: arg
        });
    }

    //滑鼠離開內容模組時觸發的事件
    handleMouseLeave(key) {
        let arg = this.state.hover;
        arg[key] = false;
        this.setState({
            hover: arg
        });
    }
    //點擊向上排序按鈕事件
    handleClickBySortUp(index, e) {
        e.stopPropagation();
        let arr = this.state.articleData.articleContent;
        if (index != 0) {
            let temp = arr[index - 1];
            arr[index - 1] = arr[index];
            arr[index] = temp;
            this.setState({
                articleData: this.state.articleData,
            });
        }
    }

    //點擊向下排序按鈕事件
    handleClickBySortDown(index, e) {
        e.stopPropagation();
        let arr = this.state.articleData.articleContent;
        if (index != arr.length) {
            let temp = arr[index + 1];
            arr[index + 1] = arr[index];
            arr[index] = temp;
            this.setState({
                articleData: this.state.articleData,
            });
        }
    }

    //點選刪除按鈕事件
    handleClickByDelete(index, e) {
        e.stopPropagation();
        let arr = this.state.articleData.articleContent;
        arr.splice(index, 1);
        this.setState({
            articleData: this.state.articleData,
        });
    }

5.CSS樣式

.rectanglesON {
    word-wrap: break-word;
    min-height: 200px;
    border: 1px dashed #808080;
    list-style-type: none;
    margin-bottom: 10px;
    cursor: pointer;
}

.rectanglesOFF {
    word-wrap: break-word;
    min-height: 200px;
    border: 1px dashed #d3d3d3;
    list-style-type: none;
    margin-bottom: 10px;
}

.listContent li {
    position: relative;
    .actionShow {
        position: absolute;
        bottom: 0;
        right: 0;
        padding-left: 10px;
        display: flex;
    }
    .actionHide {
        position: absolute;
        bottom: 0;
        right: 0;
        padding-left: 10px;
        display: none;
    }
}

.mr-5{
    margin-right:5px;
}

相關推薦

React 動態增加刪除上下移動dom

思想 在react的世界裡,都是狀態變更(資料變更)來驅動dom變化,動態新增dom不像以前用jquery一樣append一個<li>或者一個<td> 這樣了,而是通過裝載&l

動態規劃:Sunday增加刪除更替字母而成為Sarturday的最小變更次數?

如下表所示:  每個單元格可由其左方,上方,左上方的單元格變換而來。 左方:seq1變換到seq2增加了一個字母,變換次數加1; 上方:seq1變換到seq2減少了一個字母,變換次數加1; 左上方:seq1變換到seq2替換了一個字母,這時分為兩種情況:    (1)替

ListView檢視動態增加刪除控制元件條目內容

package com.example.listviewasitem; import java.util.ArrayList; import android.content.Context; import android.text.Editable; import android.text.Selectio

Android動態建立ListView檢視動態增加刪除Item.

package com.example.mycustomview; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.Activity

go語言使用go-sciter創建桌面應用(二) ui元素查找增加刪除修改

.get 添加 select false 方法 count() 桌面應用 css選擇器 html 我們可以通過go-sciter給我們提供的方法,方便的對html,css編寫的UI界面進行增刪改查。 demo3.go代碼如下: package main; im

實現表格的增加刪除復制克隆

first doctype change att -c char doc 克隆 nbsp <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

spring與quartz整合實現分布式動態創建刪除改變執行時間定時任務(mysql數據庫)

ces value 我們 job clu xsd collect 註解 common 背景:因為在項目中用到了定時任務,當時想到了spring的quartz,寫完發現費了很大功夫,光是整合就花了一上午,其中最大的問題就是版本問題,項目中用的是spring3.2.8的版本,查

Linux文件與目錄管理(復制刪除移動

一個 tex ffffff pan 鏈接方式 修改文件名 ack 不改變 ora 1.cp(復制) cp [-adfilprsu] 源文件 目標文件 參數解釋: -i:覆蓋文件之前進行詢問; -a:復制之後文件的屬性不改變(包括權限、所有者及組); -r:持續遞歸復制,就

.NET 對 XML 進行創建增加刪除修改操作整理

res add post 做了 引用 nbsp order protected png 前言:   最近做了一個項目,程序A在一個服務器程序B在另一臺服務器,然而主程序A需要訪問程序B的圖片集文件夾下載到本服務器上,為了防止多次對Web Services進行調用,在主

python3之對本地TXT文件進行增加刪除修改查看功能。

str line 進行 內容 測試 class alt nes inpu 由於是初學,代碼如有不足,歡迎指出! 本博客記錄我的編程之路,記錄所學到的知識,分享所學心得! 這是我的一個作業。 首先分析要求: 創建一個TXT文件用於存儲賬號與密碼 實現對文件進行增加,刪除,修

Eclipse 基本快捷鍵,如格式程式碼修改字型快捷提示移動刪除註釋

System.err.println(“錯誤”); // 錯誤紅色字型 基本快捷鍵 Ctrl + 1; // 快捷修復 游標指到錯誤程式碼的地方 Ctrl + D // 快捷刪除行 Shift + Enter

列表元素的增加刪除修改檢視

1.列表元素的增加 service = [‘http’, ‘ssh’, ‘ftp’] 1.直接新增元素 print(service + [‘firewalld’]) append:追加,追加一個元素到列表中 service.append(‘firewalld’) print(se

C++ STL之deque對結構體的增加刪除排序的操作

****************deque的用法******************************** c.assign(beg,end)            將[beg; end)區間中的資料賦值給c。 c.assign(n,elem)         

資料結構:實現動態順序表的各項介面(初始化銷燬尾插尾刪頭插頭刪刪除排序查詢等)

實現動態順序表 SeqList.h #pragma once ////靜態順序表 //#define N 10 //typedef int SLDateType; //typedef struct SeqList //{ // int _a[N];//陣列 /

RecyclerView死資料增加刪除轉GridView轉ListView瀑布流

用的死資料包含了增加刪除 先佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

Mybatis批量增加刪除更新Oracle

最近需要用到Mybatis批量新增oracle資料庫,剛開始在網上找到的方法是都是更新mySQL的,試了一下發現不適合Oracle,後來發現正確的oracle批量新增的sql是: <insert id="insertAttractionsBatch" parameterType="java.util.

as3中對xml的建立增加刪除修改檢索

//建立xml物件的兩種方式 var shuju:String="<a><b>你好</b><c>中國</c></a>"; //var xml:XML=new XML(shuju); var xml:XM

Delphi通過ADO連結資料庫及對資料庫的增加刪除修改讀取操作例項教程4

ADO是一種程式物件,用於表示使用者資料庫中的資料結構和所包含的資料。ADO(ActiveXDataObjects,ActiveX資料物件)是Microsoft提出的應用程式介面(API)用以實現訪問關... 7) ServerName    指定業務物件,即需要初始

具有排序增加刪除翻頁動畫的scrollview

  網上主要都是手勢拖拽動畫,關於按鍵的動畫比較少,因此做了一套。   先來一個效果圖: 下面是原始碼:   public class HorizontalPageScorllView extends HorizontalScrollV

單鏈表的基本操作(增加查詢刪除修改)-- C 語言

#include <stdio.h> #include <stdlib.h> typedef struct Link { // 資料域 int data; // 指標