本文旨在解決react mui x中實(shí)現(xiàn)無(wú)文本輸入框、僅通過(guò)按鈕觸發(fā)的彈窗式日期選擇器需求。通過(guò)結(jié)合`staticdatepicker`組件提供純粹的日歷視圖,并利用`popover`組件實(shí)現(xiàn)靈活的彈窗行為,我們將展示如何構(gòu)建一個(gè)簡(jiǎn)潔且用戶友好的日期選擇體驗(yàn),避免默認(rèn)的文本輸入框,從而優(yōu)化界面設(shè)計(jì)。
在React應(yīng)用開(kāi)發(fā)中,使用MUI X的日期選擇器(Date Picker)組件是常見(jiàn)的需求。然而,有時(shí)產(chǎn)品設(shè)計(jì)要求日期選擇器不應(yīng)顯示默認(rèn)的文本輸入框,而是通過(guò)點(diǎn)擊一個(gè)按鈕直接彈出一個(gè)日歷界面供用戶選擇日期,且該日歷應(yīng)具有模態(tài)(modal-like)行為。傳統(tǒng)的DatePicker組件通常與一個(gè)輸入框緊密關(guān)聯(lián),即使嘗試使用custom render text field或slotProps等方法,也難以徹底移除輸入框并實(shí)現(xiàn)純粹的按鈕觸發(fā)彈窗效果。StaticDatePicker雖然提供了無(wú)輸入框的日歷視圖,但其默認(rèn)是靜態(tài)展示的,不具備彈窗特性。
為了滿足上述需求,核心思路是將StaticDatePicker(用于提供無(wú)輸入框的日歷界面)與MUI的Popover組件(用于實(shí)現(xiàn)彈窗行為)結(jié)合使用。Popover組件能夠以浮層形式展示內(nèi)容,并可錨定到任何DOM元素,完美契合按鈕觸發(fā)彈窗的場(chǎng)景。
以下是實(shí)現(xiàn)無(wú)文本框彈窗式日期選擇器的具體代碼示例和解釋。
首先,確保你的項(xiàng)目中已安裝@mui/x-date-pickers、@mui/material和dayjs(或你選擇的日期庫(kù))。
import React from "react"; import Button from "@mui/material/Button"; import Popover from "@mui/material/Popover"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { StaticDatePicker } from "@mui/x-date-pickers/StaticDatePicker"; import dayjs from "dayjs";
我們需要管理Popover的打開(kāi)/關(guān)閉狀態(tài)以及它所錨定的DOM元素。
export default function DatePickerPopOver() { // anchorEl 用于存儲(chǔ)Popover所錨定的DOM元素(這里是按鈕) const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>( null ); // handleClick 函數(shù)在按鈕被點(diǎn)擊時(shí)調(diào)用,設(shè)置anchorEl為當(dāng)前點(diǎn)擊的按鈕 const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { setAnchorEl(event.currentTarget); }; // handleClose 函數(shù)在Popover關(guān)閉時(shí)調(diào)用,將anchorEl設(shè)為null const handleClose = () => { setAnchorEl(null); }; // open 變量根據(jù)anchorEl是否存在來(lái)判斷Popover是否打開(kāi) const open = Boolean(anchorEl); // id 用于可訪問(wèn)性,當(dāng)Popover打開(kāi)時(shí)設(shè)置 const id = open ? "simple-popover" : undefined; // ... (JSX 返回) }
在組件的JSX部分,我們將渲染一個(gè)按鈕來(lái)觸發(fā)日期選擇器,并在Popover內(nèi)部放置StaticDatePicker。
return ( <div> {/* 觸發(fā)日期選擇器彈窗的按鈕 */} <Button aria-describedby={id} variant="contained" onClick={handleClick}> 選擇日期 </Button> {/* Popover 組件,包含 StaticDatePicker */} <Popover id={id} // 綁定id,用于可訪問(wèn)性 open={open} // 控制Popover的打開(kāi)/關(guān)閉狀態(tài) anchorEl={anchorEl} // 錨定到觸發(fā)按鈕 onClose={handleClose} // Popover關(guān)閉時(shí)的回調(diào) anchorOrigin={{ // Popover相對(duì)于錨定元素的起始位置 vertical: "bottom", horizontal: "left" }} transformOrigin={{ // Popover自身內(nèi)容的變換起始點(diǎn) vertical: "top", horizontal: "left" }} > {/* LocalizationProvider 必須包裹所有MUI X日期組件 */} <LocalizationProvider dateAdapter={AdapterDayjs}> {/* StaticDatePicker 提供純粹的日歷視圖 */} <StaticDatePicker defaultValue={dayjs("2022-04-17")} // 設(shè)置默認(rèn)選中日期 // 可以添加onAccept, onChange等屬性來(lái)處理日期選擇事件 // onAccept={(date) => { // console.log("Selected date:", date); // handleClose(); // 選擇后關(guān)閉Popover // }} /> </LocalizationProvider> </Popover> </div> );
import React from "react"; import Button from "@mui/material/Button"; import Popover from "@mui/material/Popover"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { StaticDatePicker } from "@mui/x-date-pickers/StaticDatePicker"; import dayjs from "dayjs"; export default function DatePickerPopOver() { const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>( null ); const [selectedDate, setSelectedDate] = React.useState<dayjs.Dayjs | null>(dayjs("2022-04-17")); const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const handleDateChange = (newDate: dayjs.Dayjs | null) => { setSelectedDate(newDate); // 可選:在選擇日期后立即關(guān)閉彈窗 handleClose(); }; const open = Boolean(anchorEl); const id = open ? "date-picker-popover" : undefined; return ( <div> <Button aria-describedby={id} variant="contained" onClick={handleClick}> {selectedDate ? `已選: ${selectedDate.format('YYYY-MM-DD')}` : '選擇日期'} </Button> <Popover id={id} open={open} anchorEl={anchorEl} onClose={handleClose} anchorOrigin={{ vertical: "bottom", horizontal: "left" }} transformOrigin={{ vertical: "top", horizontal: "left" }} > <LocalizationProvider dateAdapter={AdapterDayjs}> <StaticDatePicker value={selectedDate} // 控制日期選擇器的值 onChange={handleDateChange} // 處理日期變化事件 // defaultValue={dayjs("2022-04-17")} // 如果不需要受控組件,可以使用defaultValue /> </LocalizationProvider> </Popover> </div> ); }
通過(guò)以上方法,我們成功地實(shí)現(xiàn)了在React MUI X中不顯示文本輸入框、僅通過(guò)按鈕觸發(fā)的彈窗式日期選擇器。這種組合方案既利用了StaticDatePicker的簡(jiǎn)潔日歷視圖,又借助Popover提供了靈活的彈窗交互,為用戶提供了更直觀、更符合特定UI需求的日期選擇體驗(yàn)。
以上就是MUI X Date Picker:無(wú)輸入框彈窗式日期選擇器的實(shí)現(xiàn)指南的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)