跳到內容
關於我 數位花園

部落格

React-Beautiful-DnD 簡單示範

React-Beautiful-DnD是一個很有人氣的 DnD 套件,除了基本的 Drag & Drop 功能之外,還有優雅的拖曳動畫、鍵盤拖曳支援等,使用起來也很容易入手。

React-Beautiful-DnD由三種要素組成,分別為:<DragDropContext /><Draggable /><Droppable />

下圖為官方的示意圖:

Structure

開發 React 的人對於<DragDropContext />應該不難理解, 看到context這個關鍵字就能領略箇中含義, <DragDropContext />所定義的是要實作拖拉功能的範圍

定義拖曳元件,將所要拖曳的元件包在<Draggable />裡面,結構如下:

import { Draggable } from "react-beautiful-dnd";
<Draggable draggableId={taskId} index={taskIndex}>
{(provided, snapshot) => {
const { draggableProps, dragHandleProps, innerRef } = provided;
const { isDragging } = snapshot;
return (
<div ref={innerRef} {...draggableProps} {...dragHandleProps} data-is-dragging={isDragging}>
<h4>I can DRAG! ✋</h4>
</div>
);
}}
</Draggable>;

要拖曳的元件不能直接作為children直接包在<Draggable />中間, 必須是一個函式(官方的教學影片說裡面是放一個renderProps),並在return的時候返回我們要拖拉的元件, 而函式的參數中,有<Draggable />的兩個物件:providedsnapshot

provided物件中包含draggablePropsdragHandlePropsinnerRef

  • innerRef:用來綁定拖曳的 DOM 元素
  • draggableProps:提供拖曳元件的props
  • dragHandleProps:則可另外定義拖拉的範圍,像是綁定一個 Icon 做這個拖曳元件的拖拉

snapshot物件中,我目前使用到的只有isDragging,在拖曳的狀態下,可以用來做樣式上的變換

定義放置的元件,如同<Draggable />一樣的結構,只是是加上放置的屬性,結構如下:

import { Droppable } from "react-beautiful-dnd";
<Droppable droppableId={columnId} type="task">
{(provided, snapshot) => {
const { droppableProps, innerRef, placeholder } = provided;
const { isDraggingOver } = snapshot;
return (
<div ref={innerRef} {...droppableProps} data-is-over={isDraggingOver}>
<h2>Drop on ME!! 🙌</h2>
{placeholder}
</div>
);
}}
</Droppable>;

provided物件中包含droppablePropsplaceholderinnerRef

  • innerRef:用來綁定可放置的 DOM 元素
  • droppableProps提供放置元件的props
  • placeholder就如其名,是一個佔位元素,在拖曳(但尚未 drop)的時候,提供一個放置的空間

snapshot物件中,我目前使用到的只有isDraggingOver,在被拖曳元件 hover 的狀態下,用來做樣式上的變換

最後附上範例連結

React-DnD 簡單示範

basic concept

Image Reference

HTML5 提供原生的HTML5 Drag & Drop API(以下簡稱 HTML5 DnD)實現 DOM 元素拖曳的功能。但是由於在 React 的生態底下,並不適合操作實體 DOM,因此 React-DnD 居於中間角色,作為雙方溝通的橋樑。對於 DOM 方監控 HTML5 DnD,對 React 方做 component 及 state 的處理。


監控 HTML5 DnD 事件,其中包含三個要素,Backends、拖曳項目(Item)、監視器(Monitors)

  • HTML5: 支援 HTML5 DnD 事件
  • Touch: 支援行動裝置的觸控螢幕拖曳
  • Test: 支援 DnD 的互動測試
  • 拖曳元件的身分識別
  • 定義拖曳元素可以放置在哪裡
  • 其中攜帶拖曳元件的相關資訊,提供給放置元素進行放置動作的資料操作
  • 提供 React 元件(component)來自於(實體)DOM 端的 DnD 事件
  • 監視器會將收集到來自於 DOM 的事件注入至context

Collectors 收集 React 所需要資訊,包括收集函式(Collector Functions)、拖曳元件(Drag Sources)、放置(目標)元件(Drop Target)

  • 收集函式將監視器(monitor)得到的資訊注入 React 元件的props當中
  • 綁定可拖曳的元件(component)
  • 攜帶拖曳元件的相關資訊,提供給放置元件
  • 定義可接受放置的拖曳元件

定義拖曳(來源)元件(Drag Sources)及放置(目標)元件(Drop Target)的範圍

import Backend from "react-dnd-html5-backend";
import { DndProvider } from "react-dnd";
export default class YourApp {
render() {
return <DndProvider backend={Backend}>/* Your Drag-and-Drop Application */</DndProvider>;
}
}

拖曳(來源)元件(Drag Sources)

Section titled “拖曳(來源)元件(Drag Sources)”

綁定拖曳的元件、定義拖曳的行為

import { useDrag } from "react-dnd";
function DraggableComponent(props) {
const [collectedDragProps, drag, preview] = useDrag({
// 必填欄位
item: { type: "task", id: 1 },
// 選填欄位
begin: (monitor) => {}, // 開始拖曳的時候要做什麼事
end: (item, monitor) => {},
isDragging: (monitor) => {}, // return isDragging 的條件
canDrag: (monitor) => {}, // return canDrag 的條件
collect: (monitor) => ({
canDrag: Boolean(monitor.canDrag()), // 將上述的屬性值收集起來
isDragging: Boolean(monitor.isDragging()),
didDrop: Boolean(monitor.didDrop()),
}),
});
const { canDrag, isDragging, didDrop } = collectedDragProps; // 所有收集起來的值會 collectedDragProps 裡面
return <div ref={drag}>...</div>;
}

綁定放置的元件、定義放置的行為

import { useDrop } from "react-dnd";
function myDropTarget(props) {
const [collectedDropProps, drop] = useDrop({
// 必填欄位
accept: "task", // 接受元件的類別,可以是一個陣列,放置多個接受的類別, 例如:['task', 'story']
// 選填欄位
drop: (item, monitor) => {}, // 拖曳元件放開的時候要做的事
hover: (item, monitor) => {}, // 拖曳元件hover的時候要做的事
canDrop: (monitor) => {}, // 定義是否可以拖曳的條件,return一個布林值
collect: (monitor) => ({
isOver: Boolean(monitor.isOver()), // 將上述的屬性值收集起來
canDrop: Boolean(monitor.canDrop()),
}),
});
const { isOver, canDrop } = collectedDropProps; // 所有收集起來的值會 collectedDropProps 裡面
return <div ref={drop}>Drop Target</div>;
}

最後附上範例連結

[筆記] 阿德勒勇氣整理術:丸山的居家打掃排程

當阿德勒心理學與整理術碰在一起,會是什麼樣子呢?

這是丸山郁美所寫的一本書,書名為:「阿德勒勇氣整理術」。

偶然在家裡附近的早餐店發現了這本書。

因為對整理術有一點涉略,

再加上前陣子才看完闡述阿德勒心理學的人氣書:「被討厭的勇氣」,

所以引起了我的興趣。

丸山會如何將心理學用在整理術上呢?

因為在吃早餐的當下實在不夠時間,

所以跟老闆借回家。

老闆人真好!

實踐斷捨離後,心理狀態的改變

Section titled “實踐斷捨離後,心理狀態的改變”

其實這本書我很快就看完了。

為什麼呢?

因為拜讀過前陣子很紅的極簡作家佐佐木典士的著作「我決定簡單的生活」,

對於佐佐木的減物法則很有共鳴,也實踐了將近 6 至 7 成。

因此早已克服了大部分捨不得放手的心理狀態。

所以丸山利用阿德勒心理學去克服心理恐懼這方面我大概不需要再多做著墨 😂

謎:你不是來寫這本書的心得文嗎?重點卻帶過是不是想要偷懶啊?

丸山將阿德勒心理學融入整個整理的過程。

雖然整理這件事,看起來像是 100% 物質面的事情,

但在進行的過程中,心理狀態卻是千頭萬緒:

物品放置位置的抉擇、丟棄物品的猶豫再三、花費大量時間整理卻沒有成效、整理乾淨卻又在一夕之間恢復原狀的挫折感 ⋯⋯ 等等

因此克服心理層面是非常重要的一環。

相對於佐佐木這樣偏向「苦行僧」類型的極簡主義者,

丸山強調的是「打造居家舒適的空間」

不強迫丟東西,而是思考生活中

哪些是必要的、哪些是想要的

哪些東西讓我們覺得舒服

這個概念跟紅到歐美的整理大師「近藤麻理惠」所提倡的「怦然心動」(Spark joy)心境很類似 1

就我自己的分類而言,她們算是「中庸」的極簡主義者(或稱為溫和派、鴿派 😆)

在本書中讓我感到興趣的,是丸山自製的「年度打掃行事曆」。 這個表格如下圖:

table

她將家裡所有需要定期打掃的項目全部列出來(最左邊一欄),

右邊分為 1 月至 12 月

白色格子是當月要去要打掃的項目;

灰色的部分是不用清掃也無所謂的地方。

每個月檢視一次這張表,並在白色格子裡面紀錄打掃這個項目的日期。

這張表還有一個小細節,

丸山提到:

我每年只會在油污容易清除的八月進行一次抽油煙機大掃除,其他月份就做一些更換濾網之類簡單到掃而已。

清理冰箱方面,我每個月也只會清潔製冰盒的部分。至於把所有食品取出,清洗層架及抽屜的作業,只有在房間的室溫降到和冰箱相去不遠的二月才會進行。

因為冰箱與室內溫度不大,這麼一來,既不會影響食品的新鮮度,也能節省地電費。

很多人都會在年底進行大掃除的時候擦窗戶,但我擦窗戶的的月份是五月及十一月。

因為即使年底擦乾淨了,還是很快就會被花粉弄髒。所以我把擦窗戶的時間,訂在花粉季結束,以及十一月颱風季與秋天的綿綿陰雨結束,窗戶被風雨徹底弄髒之後。

她在某些清掃項目的時間決定上特別思考過,

而不是依照一般既定印象的大掃除習慣。

這跟我將每月維修項目時間錯開是類似的概念,

甚至連季節、天氣因素都考慮進去了,

真的很細心。

不過這份表格也不是一個標準,使用者可以隨著自己的喜好調整。

例如台灣沒有花粉季、颱風季也跟日本不太一樣,

隨著不同的地區做適當地修改,所以擦窗戶的時間可以更自由一點。

(我自己是每個月擦一次窗戶啦 😏)

有興趣的同學

可以參考我寫的關於維修日的文章

至於丸山的阿德勒整理術的精髓

有興趣的朋友可以閱讀這本書喔(喂

今天的分享就到這裡

我們下次見 👋

  1. 如果對「近藤麻理惠」有興趣的話,可以參考她的著作:「怦然心動的人生整理魔法

交錯的維修日:減輕日常維護工作的心理負擔

日常的維護工作既費時又繁瑣,但是不做又不行,

這是每個人一定會遇到的問題,也會造成心理上的負擔。

最有生產力的一年」這本書的作者:克里斯・貝利在書中提到,

他不想花時間在這些麻煩事上,因為這些事情雖然低回報,卻不得不做,

這些事很容易引發拖延症(Procrastination)。

克里斯提出了稱為「維修日」的方法,也就是將這些維護工作擱置,

並在某一天一次處理完。他在平日將所有低回報維護任務都先記錄下來(記得不要去做),

然後在週日一次處理。

當然了,克里斯將維修日訂在週日,

並不代表一定是週日(也不一定是每週一次),可以是任何我們自己選擇的一天。

至於維護工作是指哪些?克里斯在書中列出了他完整的維修日待辦事項清單:

  • 採買雜貨
  • 打掃房子和辦公室
  • 規劃飲食和健身計畫
  • 修剪鬢毛、刮鬍子
  • 洗衣服
  • 準備一整個星期的午餐,分裝至微波保鮮盒裡
  • 澆花
  • 閱讀我一整個星期收藏的文章
  • 審視我的各項計畫,並確定接下來的步驟
  • 查看我的「等待清單」
  • 決定未來一週想要達成的三項目標
  • 清楚我的全部的收件匣
  • 檢視我的「熱點」
  • 檢視我的「成就清單」

這份待辦事項的內容因人而異,沒有蓄鬍的人大概無法一週刮鬍子吧 😂

雖然在讀克里斯的這本書之前,我就一直有在用手機「提醒事項」APP 提醒自己做一些事,

但在看過他的維修日的概念之後,也因此做了些調整。

我沒有將所有的事集中在一週的某一天來做,

而是依照不同的事項所需要的頻率去設定提醒事項。

我的維修待辦事項(這裡不稱為維修,畢竟我沒有集中成一天)分為三大類,分別是:

  • 每日提醒(DailyLoop)
  • 週循環維護(WeeklyLoop)
  • 月循環維護(MonthlyLoop)

順帶一提,命名方式隨個人喜好,我也很滿意這個名稱。😎

list

首先是每日提醒

daily

也許你會問,剛才不是說維修日要集中執行嗎?怎麼還有每日提醒?

每日提醒主要是培養「習慣力」,將我們想要培養的好習慣列出來,

並且確實的按照規定的時間去執行,這裡要注意的是對自己誠實,沒有做就不要打勾。

每個項目的提醒時間底下,還可以列出需要花多少時間做這個項目(自己預估),

如此在有空閒時,不管是多短暫,例如等公車的 5 分鐘,

只要打開提醒事項 APP,就可以一目了然當下適合做什麼樣的項目。(當然僅適合手機上能夠完成的事項)

第二類是週循環的維護項目

weekly

  • 更換睡衣 - 每週
  • 擦家中地板 - 每週
  • 剪指甲 - 每 2 週

第三類,月循環項目

monthly

  • 擦窗戶 - 每月第 1 週週日
  • 皮件保養 - 每月第 2 週週日
  • 清洗鞋墊 - 每月第 3 週週日
  • 百葉窗簾清潔 - 每月第 4 週週日
  • 更換床單、枕套 - 每月
  • 剪髮 - 每 2 個月
  • 整理發票(兌獎)- 每 2 個月
  • 預約牙醫洗牙 - 半年
  • 蝦皮賣場價格調整 - 每月

前面四項都是想要每個月保養一次的項目,

但如果像是克里斯那樣,將所有項目塞在一整天裡面,實在是太累了,

而且我不想花太多週末寶貴的時間。

因此我將這四個每月循環的項目錯開,「第一週擦窗戶」、「第二週做皮件保養」、⋯⋯,以此類推。

如此一來,月循環保養的負擔將會減輕許多。其他的項目,

因為因為不需要花太多時間(不超過 10 分鐘),

像是一些衛生方面考量要替換的東西,我就沒有特別錯開時間了。

至於每半年一次的洗牙,是健保的規定。

以上是關於日常維護項目的一些分享,我們下次再見。👋

給物品找新主人:舊物的處理管道

自從我在露天拍賣賣出第一個自己的東西之後,

就踏上了「自家經營二手商店」的不歸路(誤)

從小學開始,就養成了整理自己東西的習慣

間隔時間印象中是一年一次,然後都是在時間最多的暑假

每一次的大整理都是除了回顧自己擁有哪些東西之外,

「丟棄」這個動作更是心理大考驗

自從我讀了日本極簡大師佐佐木典士的著作「我決定簡單的生活」之後,

就踏上了處理雜物的旅程

處理雜物最快也最簡單的方式,就是直接丟掉(或回收)

但我想一般人不會這麼做的

除非你是揮霍無度、或經濟狀況很好的人

把可以用的東西直接扔掉,不但浪費地球資源、也跟你的良心過不去

所以送人及出售轉讓就變成了「沒有罪惡感」的方式了

佐佐木在書中提到了幾個他處理雜物的方式:

第一是透過拍賣網站 mercari(メルカリ),它是日本新興(相較於樂天 Rakuten、日本 Yahoo 拍賣)的拍賣平台,在美國也有上市,台灣沒有

第二是拍賣代售平台「QuickDo」,這個我覺得很不錯的地方在於代售的功能

意思就是你不用自己經營拍賣,他們會派人到府把你要上架拍賣的東西收走

然後你就可以 ⋯⋯

什麼事都不用做,等著東西被買走後,錢進帳

上架過程、跟買家溝通、包裝出貨,

麻煩的手續完全還有他們包辦

多麼地愜意啊啊啊!!

很可惜就我所知,台灣沒有類似這樣的服務

好吧,那只有自己來了

也就是說,佐佐木的那些方法只能當作參考

我們必須尋找自己當地才有的平台

誠如本文一開始提到,我第一個經營的個人賣場是在露天上面

後來發現越來越多人使用蝦皮拍賣這個平台

再加上蝦皮推出了便利超商店到店寄送免運費一系列的活動

開啟了「免運紀元」,其他家拍賣平台也趕緊跟進加入「免運大作戰」

那是大約 2016 年的事(有錯請指正)

而我也在那時毅然決定從經營大約半年多的露天拍賣跳槽至蝦皮拍賣

好了 這個前情提要有點冗長了

進入正題吧

以我目前使用兩種平台來處理二手物品:

  • 第一就是前面提過的蝦皮
  • 第二就是 PTT

我在蝦皮至今為止也經營了約兩年的時間

蝦皮只是我目前個人的喜好

之後跳槽別家也說不定

台灣目前的拍賣平台有很多選擇:

PS. 可能還有些我不知道的請各位補充 🙏

可以依據個人喜好及習慣選擇拍賣平台

拍賣平台的優勢就是什麼都有、什麼都可賣、什麼都不奇怪(當然不要賣違法的東西就是)

但是也因為東西種類繁雜,如果是冷門的東西曝光率就會被稀釋

假設我們想要賣動漫周邊商品、模型

在買動漫上架,能見度或許會高出許多(不負責任分析(喂

針對某項類別的物品

可以尋找有分類的平台

這也就是我用 PTT 的原因

有分類的平台,就能提升曝光率

像是我若要賣日文書(或小說),就會在 NihonBook 版發文

要出售模型,可以去 model 版、或是 PVC-GK 版

賣輕小說,就在 LightNovel 版發文

曾經也買過一把吉他,在 guitar 發文

Facebook 也有類似這樣的社團 像是「二手 網球拍」交流這個社團

我們可以在這裡賣很少在用的球拍

而在這個社團裡的人,都是有可能會購買球拍的人(相較於其他平台)

利用拍賣平台將舊物脫手,是一個很好的管道

它有很多優點,同樣也有缺點:

  • 脫手舊物的同時,還可以拿回一點折舊金
  • 利用拍賣上架的過程(包括拍照、寫文案等),檢視自己擁有的物品,並做購物心理的分析(不明白我在說什麼?就是檢討自己為什麼亂買東西啦~)
  • 拍照上架、寫文案
  • 商品的管理
  • 商品要擺放在哪裡
  • 商品包裝、自己去出貨
  • 遇到奇怪的買家要如何應對
  • 買家要看更清楚的照片(例如:不同角度) ⋯⋯

應該還有很多

看到這裡或許會有人開始疑惑,這麼多缺點還介紹什麼拍賣

現在明白了,不浪費地球資源的代價有多大了

這樣往後就不要看到便宜或是喜歡就急著掏腰包

PS. 而我到現在,還在為自己當初亂買的東西消業障(賣東西 T_T

我相信會點進來看這篇的人

多少都覺得自己身邊的雜物有點多

想要整理卻有跨不出第一步

或許你看到這麼多的缺點都卻步了

覺得好麻煩

相信我,我也這麼覺得

雖然這三年多不斷地在賣東西、少買東西

但是這種中間不斷地在內心拉扯

你可能問,在拉扯什麼?

嫌麻煩不想做啦~

懶得拍照、懶得訂價格、懶得寫文案

然後就是各種拖延症爆發

好,你不要這麼麻煩

用送人的好了

自己很少用的都給你直接送人也無所謂

如果你的心理層面進入了這個層次

那就用贈送的吧!

如果你捨不得送人

我想分享幾句佐佐木書中的幾句話:

不要一直想著購買時的價格

「當初買多少錢,所以我要賣多少才不會虧太多」

我承認我也會有這種想法

誰不想要虧損少一點

但是舊物就是會貶值的啊

丟掉「回本」的念頭:承認虧損,即早放手

除非你要賣出的東西是會升值

而且比當時原價還高的那種

例如未拆封的第一代 iPhone 之類的

但我想這類東西你也不會想要脫手吧

說到回本,除非你當初買來就是看中它會漲價

拿著東西不是拿來用的,而是拿來投資的

承認失敗,當做花錢買經驗

這就是之前提過的,承認自己當時失心瘋

一時衝動買了卻很少拿來用的東西

告訴自己:就算虧損,也要得到經驗

下次買東西的時候三思,問自己是否真的需要,還是只是想要?

以上是心理層面的準備

我平常使用贈送的方式

是在 PTT 的 Give 版(贈送版)發文

這個版的發文頻率非常高

每天都有在送東西

你可以在上面發文,貼個圖片連結、物品說明

然後等有人來跟你聯絡取物

就這樣!

發文頻率之高,瞬間東西被掃光的情況很常見

贈物比起在拍賣上架、等人下標,速度快好幾倍

但就是免費送人啦~

而且版友大部分都是愛物惜物的人

相信你的舊物也不會直接進垃圾桶,可以安心啦~

另外,在 Facebook 也有類似的贈物社團、換物的社團

我曾經加入過這個社團:不要再買了!免費的幻物與幻務

裡面是用物品交換的方式

這樣也可以減輕一點放不下虧損的心理

又可以換到想要的東西

不對,是需要的東西

今天的分享就到這裡

我們下次見 👋