1. 程式人生 > >在react中,通過點選選中元件的兩種情況

在react中,通過點選選中元件的兩種情況

想要通過點選元件,來進行元件選中與未選中狀態的變換,可以分為兩種情況,一種是點選哪一項該項選中,其他項不變,即為唯一選中;另一種是點選一項後,再點選其他項,會選中多項,再次點選已選中項會取消選中狀態。

下面來分別看一下在react中的兩種實現手法,基本思路都是通過state來控制選擇項,通過三元運算子來進行元件樣式的變換。

第一種,唯一選中:

先在model檔案中寫state,state裡設定一個變數來標識當前選中項

namespace: 'InfoOverview',

state: {
  longLineState: 1, //唯一標識當前項
},

在元件檔案中,連線model後,先為每一項元件建立唯一標識ID,再根據ID與longLineState判斷值來進行元件樣式的變換。

const {InfoOverview, dispatch, longLineID} = this.props;
let { longLineState } = InfoOverview;

const changeLong =(longLineID) => {
  dispatch({
    type: 'InfoOverview/upState',
    payload: {
      longLineState: longLineID,
    }
  })
};
return (
  <div
    className={longLineState === longLineID ? styles.longLineBox2 : styles.longLine}
    onClick={() => changeLong(longLineID)}
  >...</div>

這樣,每一次點選就會將當前項ID置為longLineState,ID與longLineState相等時呈現選中樣式,ID與longLineState不等時呈現原樣式不變,這樣就實現了唯一選中的效果。

第二種:多項選中,可取消選中:

思路相差不多,先在model檔案中寫state,state裡設定一個數組來標識當前選中項們

namespace: 'InfoOverview',

state: {
  longLineState: [1,2], //標識當前選中項,此時為第一項和第二項被預設選中
},

元件檔案連線model後,通過判斷陣列中是否包含某項ID來為它設定樣式,某項被點選時,如果它被包含於陣列,則表明它已被選中,所以我們要將他從陣列中刪除來取消選中狀態;如果它不在陣列中,則我們要在陣列中新增它來使它處於選中狀態。

const {InfoOverview, dispatch, longLineID} = this.props;
let { longLineState } = InfoOverview;

const checkItem = longLineState.indexOf(longLineID);
const changeLong =(longLineID) => {
    checkItem > -1 ? longLineState.splice(checkItem, 1):  longLineState.push(longLineID);
    dispatch({
        type: 'InfoOverview/upState',
        payload: {
          longLineState: longLineState,
        }
    })
};
return (
  <div
    className={checkItem > -1  ? styles.longLineBox2 : styles.longLine}
    onClick={() => changeLong(longLineID)}
  >...</div>

陣列中的元件項ID即為選中項,沒有ID的元件項即為未選中項。

另外,提一句滑鼠懸浮在元件上時樣式變換寫法:

原樣式:

.longLine {
  height: 38px;
  width: 90%;
  border: 1px solid rgba(143, 182, 239, 1);
  border-radius: 27px;
  text-align: center;
  margin-left: auto;
  margin-right: auto;
  line-height: 38px;
  font-size: 16px;
  margin-top: 20px;
  margin-bottom: 20px;
  .longLineImg {
    height: 26px;
    width: 26px;
  }
  .longLineText {
    text-align: left;
    color:rgb(102, 153, 255);
  }

  .longLineNum {
    color: rgb(255, 153, 0);
  }
}

懸浮樣式:

.longLine:hover {
  background-color: rgba(143, 182, 239, 1);
  .longLineText {
    color:white;
  }

  .longLineNum {
    color: white;
  }
}

只需要改寫變動的樣式即可,其他樣式會自動沿用。

相關推薦

react通過選中元件情況

想要通過點選元件,來進行元件選中與未選中狀態的變換,可以分為兩種情況,一種是點選哪一項該項選中,其他項不變,即為唯一選中;另一種是點選一項後,再點選其他項,會選中多項,再次點選已選中項會取消選中狀態。 下面來分別看一下在react中的兩種實現手法,基本思路都是

WPF 平板上按鈕不觸發滑鼠觸發的解決方法

原文: WPF 平板上按鈕點選不觸發,滑鼠點選觸發的兩種解決方法 今天執行在windows平板上的程式,有個功能是彈出子窗體,點彈出窗體的關閉按鈕,要點好幾次才能觸發。網上找了找,也有人與我類似的情形。 解決方法如下: public static void DisableWPFTabletSupp

React Native】React NativeDrawerLayoutAndroid通過實現展開和關閉

  React Native中,DrawerLayoutAndroid元件與Android原生開發中的DrawerLayout一樣實現側滑選單的效果。通過手勢左右滑動實現拉出與退出的操作,但是需要通過點選圖示或者文字就能彈出側滑選單該怎麼做呢?   這時就需要

spannablestring用在fragment設定監聽無效

主要程式碼如下         @Override         public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {             super.onViewCr

robot framework程式執行過程遇到事件之後未出現之後的效果(求解)

1.click Element操作,在實際過程中偶然會出現,日誌顯示已點選成功,但是實際自動化頁面,沒有點選成功之後的操作 現象: 現象描述:程式執行到點選側邊欄的【人員資訊】之後,日誌顯示已經點選成功,但是報錯截圖可以看到並沒有相對應點選成功之後,出現的人員資訊頁面,故判斷找不到開啟頁面 測試中其他的

動態表格通過按鈕增加或者刪除一行表格!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE>

iOS如何通過UITableViewCell的Button來獲取當前Cell的indexPath

- (void) btnOnClickTouched:(UIButton *)aButton { myTableViewCell* myCell = (myTableViewCell *)[aButton superView]; //表示Button新增在了Cell中。 //如果將Button新增在myCe

在Activity響應ListView內部按鈕的事件的方法!!! 在Activity響應ListView內部按鈕的事件的方法

  轉載:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群裡面有人問到一個問題:如何在Activity中響應ListView內部按鈕的點選事件,不要在Adapter中響應? 對於這個問題,我最初給他的解答是,在Adapter中定義

《Java》Java“字串操作”實際應用——形成GBK編碼和UTF-8編碼的文字檔案通過其二進位制資料觀察編碼的不同

一、任務目標     完成一個java application應用程式,可以把GBK編碼的漢字字串與UTF-8編碼的漢字字串相互轉換。並配合寫檔案操作形成不同編碼格式的文字檔案,可以通過其二進位制資料觀察兩種編碼的不同。   二、程式設計思路     博主將“程式設計思路”以流程

RecyclerView(一)事件的方式

recyclerview自身不帶有點選事件的回撥,以下實現recyclerview點選事件的兩種方式 1、通過介面回撥的方式: 直接上程式碼加註釋 1、首先定義點選的介面 public interface OnItemClickListener

web安全:防範劫持的方式

防範點選劫持的兩種方式 什麼點選劫持?最常見的是惡意網站使用 <iframe> 標籤把我方的一些含有重要資訊類如交易的網頁嵌入進去,然後把 iframe 設定透明,用定位的手段的把一些引誘使用者在惡意網頁上點選。這樣使用者不知不覺中就進行了某些不安全的操作。 有兩

【easyUI】取消easyui行選中事件智慧通過checkbox才能中行

背景:專案中使用easyui作為前端架子。datagrid預設是點選行就選中此行然後變色。 需求:點選行不讓此行選中;只能通過點選複選框才能選中某一行。 解決思路:   1、寫點選行函式function onClickRow(rowIndex,rowData){}   2、查詢當前datagrid所有

js迴圈遍歷ulli的事件給給選中li新增css

功能:對於一個ul中固定的li個數,當點選其中一個li時,改變選中li的顏色;同時改變對應的另一個ul中li的顏色頁面初始化的介面:HTML: <div > <label>其他推薦:</lab

C++實現WebBrowser控制元件對滑鼠事件的監聽並獲取所標籤的超連結

        主要步驟如下:         1、接收網頁事件(參考資料) 要響應網頁事件,需要實現IDispatch介面,並在其Invoke()方法中處理收到的訊息。對於MFC,因為CCmdTarget類已經實現了該介面,所以只需要繼承CCmdTarget並結合相關巨

Listview、RecyclerView的item包含可以的控制元件衝突解決辦法

在item的根佈局中新增: android:descendantFocusability="blocksDescendants" 可點選的子item新增 android:focusable="f

Java的事件處理—通過不同的按鈕讓面板的背景色發生變化

package com.event; import java.awt.*; import javax.swing.*; import java.awt.event.*; //Java事件處理 p

製作login.jsp頁面要求實現提供使用者登陸的介面 使用者通過該介面輸入使用者名稱(控制元件名userName)和密碼(控制元件名password) 然後“登入”按鈕實現登陸操作.

例題: 1.製作login.jsp頁面,要求實現提供使用者登陸的介面, 使用者通過該介面輸入使用者名稱(控制元件名userName)和密碼(控制元件名password), 然後點選“登入”按鈕實現登陸操作. 2.製作welcome.jsp頁面,要求在該

平移動畫某個控制元件讓一個view收縮到右邊螢幕展開。

最近做了一個需求。就是點選一個箭頭 ,讓一個view收縮到右邊螢幕,再點選這個View展開,其實看是收縮,其實是平移,讓這個View平移View.getWidth的寬度,同時把這個View的座標也平移過去(不平移座標,點選監聽會還在原來的位置),再讓這個View平移  —View.getW

tabulator預設選中設定當前選中項不取消選擇

tabulator預設選中,設定點選當前選中項不取消選擇 $("#table").tabulator({ height:"92%", layout:"fitColumns", columnVertAlign:"bottom", tooltips:true

Android短視訊開發通過進行的命令操作所需原始碼合集

在短視訊操作中,“點選識別命令”的操作是非常常見的,幾乎一切命令都需要靠使用者點選來實現,因此,在Android短視訊開發中,雙擊點贊,點選評論、關注、分享,點選頭像進入主頁功能都是最常見的功能。 接下來,我將從程式碼的角度為大家展現這些功能的實現方式:   【雙擊點贊】通過此