最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于React實現(xiàn)一個todo打勾效果

 更新時間:2024年03月24日 09:20:29   作者:陽樹陽樹  
這篇文章主要為大家詳細介紹了如何基于React實現(xiàn)一個todo打勾效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

正好呢,最近做的一些東西讓我燃起了一些些記錄的熱情,不能再咕咕了。

背景是我自己做的 landing 項目里有一個實現(xiàn)類似飛書里的 todo 的效果,然后我研究了下飛書,寫出來了一個 demo。

我們先來提出幾個問題,解決了之后,我們也就實現(xiàn)了一個todo

  • 前面的 icon 用什么來實現(xiàn)。
  • 如何實現(xiàn)文字不可點擊,前方icon可點擊的效果?
  • 如果有多個元素循環(huán)渲染的情況下,我們怎么在點擊的時候?qū)蝹€元素做樣式的修改?(React)

這里有幾個部分需要來討論:

首先是整個用什么來實現(xiàn)這個前面的 icon,是使用偽元素,還是使用一個真實的元素?

這里我看飛書直接用的偽元素來實現(xiàn)的,感覺可能是能用 css 解決的問題就沒有必要再去用 html 去寫了,那么大致實現(xiàn)邏輯如下。

 <div class="todo" id="todo">11111</div>

我們使用偽元素實現(xiàn)這個樣式的時候,左側(cè)并不會撐開,也就是說,我們需要去給這個 div 一個靠左的 margin 值。然后再去做具體的打勾框。

    .todo {
        pointer-events: none;
        margin-left: 20px;
    }

    .todo:before {
        content: " ";
        display: inline-block;
        line-height: normal;
        font-size: 16px;
        border: 1px solid black;
        border-radius: 4px;
        background-position: 50%;
        white-space: normal;
        width: 16px;
        height: 16px;
        margin-right: 8px;
        margin-left: -24px;
        box-sizing: border-box !important;
        position: relative;
        cursor: pointer;
        pointer-events: auto;
        top: 2px;
    }

那么上面這些代碼,就可以得到下圖的展示效果:

是不是看起來已經(jīng)有了完整的樣子啦。

這是我們的 todo 狀態(tài),我們還需要實現(xiàn)一個 done的狀態(tài),所以還需要額外的 css 去書寫,這里需要注意的是,為了交互更加好看,我們在 hover 的時候會讓偽元素的樣式變藍。于是增加了如下代碼,有了下圖所示的效果

    .todo:hover:before {
        border: 1px solid rgb(100, 149, 237);
    }

第二個點就是,我們?nèi)绾螌崿F(xiàn)一個文字不可點擊,前方icon可點擊的效果呢?

其實在上面的代碼中已經(jīng)展示出來了,為這個 div設(shè)置pointer-events: none;,然后給偽元素設(shè)置pointer-events: auto;就可以啦。

這些考慮完之后,我再給你們展示一下點擊狀態(tài)的css咋寫的:

    .done {
        text-decoration: line-through;
    }

    .done::before {
        background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjU4OSAzLjkwM2wuODA4LjgwOGEuMzUuMzUgMCAwMTAgLjQ5NUw2LjE4IDEwLjQyNWEuMzUuMzUgMCAwMS0uNDk1IDBMMi43MDMgNy40NDRhLjM1LjM1IDAgMDEwLS40OTVsLjgwOC0uODA4YS4zNS4zNSAwIDAxLjQ5NSAwbDEuOTI1IDEuOTI0IDQuMTYzLTQuMTYzYS4zNS4zNSAwIDAxLjQ5NSAweiIgZmlsbD0iIzMzNzBGRiIvPjwvc3ZnPg==);
    }

那么你給這個 div 再加上 done 的類名,就可以得到下圖的效果了:

最后呢,如果我們有多個 div,我們?nèi)绾稳プ鲱惷奶幚砟兀?/p>

答案是監(jiān)聽點擊事件,然后在點擊的時候更換類名,代碼如下:

    const div = document.getElementById('todo');
    div.addEventListener('click', (target) => {
        const classArr = target.currentTarget.className.split(' ');
        if (classArr.length > 1) {
            target.currentTarget.className = 'todo'
        } else {
            target.currentTarget.className = 'todo done'
        }
    })

完整代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="todo" id="todo">11111</div>
</body>
<script>
    const div = document.getElementById('todo');
    div.addEventListener('click', (target) => {
        const classArr = target.currentTarget.className.split(' ');
        if (classArr.length > 1) {
            target.currentTarget.className = 'todo'
        } else {
            target.currentTarget.className = 'todo done'
        }
    })
</script>
<style>
    .todo {
        margin-left: 20px;
    }

    .todo:before {
        content: " ";
        display: inline-block;
        line-height: normal;
        font-size: 16px;
        border: 1px solid black;
        border-radius: 4px;
        background-position: 50%;
        white-space: normal;
        width: 16px;
        height: 16px;
        margin-right: 8px;
        margin-left: -24px;
        box-sizing: border-box !important;
        position: relative;
        cursor: pointer;
        pointer-events: auto;
        top: 2px;
    }

    .todo:hover:before {
        border: 1px solid rgb(100, 149, 237);
    }

    .done {
        text-decoration: line-through;
    }

    .done::before {
        background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjU4OSAzLjkwM2wuODA4LjgwOGEuMzUuMzUgMCAwMTAgLjQ5NUw2LjE4IDEwLjQyNWEuMzUuMzUgMCAwMS0uNDk1IDBMMi43MDMgNy40NDRhLjM1LjM1IDAgMDEwLS40OTVsLjgwOC0uODA4YS4zNS4zNSAwIDAxLjQ5NSAwbDEuOTI1IDEuOTI0IDQuMTYzLTQuMTYzYS4zNS4zNSAwIDAxLjQ5NSAweiIgZmlsbD0iIzMzNzBGRiIvPjwvc3ZnPg==);
    }
</style>

</html>

到此這篇關(guān)于基于React實現(xiàn)一個todo打勾效果的文章就介紹到這了,更多相關(guān)React todo打勾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React從Class方式轉(zhuǎn)Hooks詳解

    React從Class方式轉(zhuǎn)Hooks詳解

    這篇文章主要介紹了React從Class方式轉(zhuǎn)Hooks詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • React學(xué)習(xí)筆記之條件渲染(一)

    React學(xué)習(xí)筆記之條件渲染(一)

    條件渲染在React里就和js里的條件語句一樣。下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)記錄之條件渲染的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • React操作DOM之forwardRef問題

    React操作DOM之forwardRef問題

    這篇文章主要介紹了React操作DOM之forwardRef問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • React router cache route實現(xiàn)緩存頁面流程介紹

    React router cache route實現(xiàn)緩存頁面流程介紹

    react-router自身沒有路由緩存的特性,在5.x版本之前,我們可以基于react-router-cache-route來實現(xiàn)路由緩存功能。但是react-router 6.x在實現(xiàn)上做了比較大的變化,react-router-cache-route沒有提供相應(yīng)的支持
    2023-01-01
  • 十分鐘帶你快速了解React16新特性

    十分鐘帶你快速了解React16新特性

    這篇文章主要介紹了十分鐘帶你快速了解React16新特性,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 教你使用vscode 搭建react-native開發(fā)環(huán)境

    教你使用vscode 搭建react-native開發(fā)環(huán)境

    本文記錄如何使用vscode打造一個現(xiàn)代化的react-native開發(fā)環(huán)境,旨在提高開發(fā)效率和質(zhì)量。本文給大家分享我遇到的問題及解決方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • React實現(xiàn)下拉框的key,value的值同時傳送

    React實現(xiàn)下拉框的key,value的值同時傳送

    這篇文章主要介紹了React實現(xiàn)下拉框的key,value的值同時傳送方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 在React中實現(xiàn)Vue的插槽功能的示例代碼

    在React中實現(xiàn)Vue的插槽功能的示例代碼

    在?Vue?中,插槽(Slots)允許父組件向子組件傳遞?HTML?結(jié)構(gòu),從而實現(xiàn)更靈活的組件復(fù)用,具名插槽允許父組件向子組件傳遞多個不同的?HTML?結(jié)構(gòu),在?React?中,我們沒有直接的插槽概念,但可以通過?props.children?和函數(shù)作為?props?來實現(xiàn)類似的功能
    2025-01-01
  • React高階組件的使用淺析

    React高階組件的使用淺析

    高階組件就是接受一個組件作為參數(shù)并返回一個新組件(功能增強的組件)的函數(shù)。這里需要注意高階組件是一個函數(shù),并不是組件,這一點一定要注意,本文給大家分享React高階組件使用小結(jié),一起看看吧
    2022-08-08

最新評論

大冶市| 贵南县| 贡觉县| 乐亭县| 和顺县| 无为县| 泰兴市| 安国市| 渝中区| 益阳市| 池州市| 岱山县| 杨浦区| 长岛县| 余姚市| 高台县| 望奎县| 密云县| 垫江县| 措美县| 呼和浩特市| 开封市| 南皮县| 襄汾县| 昔阳县| 岚皋县| 会东县| 虎林市| 通州市| 兰西县| 龙里县| 富民县| 木里| 灌云县| 岳普湖县| 梁平县| 庐江县| 富宁县| 红原县| 黑河市| 出国|