[英]Nesting MaterialUI HtmlTooltip inside of Material UI Select MenuItem / Synthetic event(?) problem in select onChange handler
[英]Blur Material UI Select component on the onChange event
默認情況下,MaterialUI 的 Select 組件在選擇一個選項后會自動聚焦。 這種行為可以在他們的文檔中的所有示例中看到
一旦選擇了某些東西,我希望元素變得模糊。 這是我的代碼目前的樣子:
const App = () => {
const [selectedValue, setSelectedValue] = useState('')
const selectElement = useRef(null);
return (
<Select
native
ref={selectElement}
value={selectedValue}
onChange={(evt) => {
setSelectedValue(evt.target.value)
// Attempt at blurring the element upon selection using the useRef:
selectElement.current.blur(); // Nothing happens
// Attempt at blurring the element upon selection using activeElement:
document.activeElement.blur(); // Get Error: "Property 'blur' does not exist on type 'Element'."
}}
>
<option value='option 1'>Option 1</option>
<option value='option 2'>Option 2</option>
<option value='option 3'>Option 3</option>
</Select>
);
};
正如您在代碼中看到的那樣,我嘗試使用我發現的兩種不同方法來做到這一點:
通過useRef()
:這什么都不做,沒有錯誤或任何東西,但不會模糊我的元素
通過document.activeElement
:這給了我一個錯誤,顯然類型元素上不存在屬性blur
。
選擇一個選項后模糊我的 Select 組件的正確方法是什么?
將一些評論總結成一個答案:
正如@2pha 所建議的那樣,使用evt.target.blur()
可能是通往 go 的途徑:
const App = () => {
const [selectedValue, setSelectedValue] = useState('');
return (
<Select
native
value={selectedValue}
onChange={(evt) => {
setSelectedValue(evt.target.value);
console.log(document.activeElement); // <select>
evt.target.blur();
console.log(document.activeElement); // <body>
}}>
<option value="option 1">Option 1</option>
<option value="option 2">Option 2</option>
<option value="option 3">Option 3</option>
</Select>
);
};
沙盒: https://codesandbox.io/s/empty-night-oqlgr
ref 不起作用,因為它被轉發到根元素(一個div
)而不是select
元素。
您看到的與document.activeElement
相關的錯誤看起來與 TypeScript 相關。 您看到它是因為document.activeElement
一般類型為Element
,它沒有blur
方法。 您需要指定HTMLSelectElement
類型,但似乎不值得采用該路線,因為僅使用evt.target
更直接。
受@ericgio 和@Ryan Cogswell 的啟發,有另一種方法可以解決這個問題。 對於非原生元素,我們可以將setTimeout
function 分配給onClose
,這將在從菜單中選擇選項后模糊元素。
const App = () => {
const [selectedValue, setSelectedValue] = useState('');
const [age, setAge] = React.useState('');
const handleChange = (event) => {
setAge(event.target.value);
};
return (
<div>
<div>
<Select
style={{ width: '200px' }}
native
value={selectedValue}
onChange={(evt) => {
setSelectedValue(evt.target.value);
evt.target.blur();
}}>
<option value="option 1">Option 1</option>
<option value="option 2">Option 2</option>
<option value="option 3">Option 3</option>
</Select>
</div>
<FormControl style={{ width: '200px' }}>
<InputLabel id="demo-simple-select-label">Age</InputLabel>
<Select
onClose={() => {
setTimeout(() => {
document.activeElement.blur();
}, 0);
}}
value={age}
onChange={handleChange}>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</div>
);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.