在 onChange 事件上模糊 Material UI Select 组件
Blur Material UI Select component on the onChange event
默认情况下,MaterialUI 的 Select 组件在选择一个选项后会自动聚焦。这种行为可以在他们 docs
中的所有示例中看到
我希望元素在被选中后变得模糊。这是我的代码目前的样子:
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
does not exist on type element.
选择选项后模糊我的 Select 组件的正确方法是什么?
将一些评论总结成答案:
正如@2pha 所建议的那样,使用 evt.target.blur()
可能是可行的方法:
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
引用无效,因为 it's being forwarded to the root element(div
)不是 select
元素。
您看到的与 document.activeElement
相关的错误看起来与 TypeScript 相关。您看到它是因为 document.activeElement
一般类型为 Element
,它没有 blur
方法。您需要指定 HTMLSelectElement
类型,但似乎不值得采用该路线,因为仅使用 evt.target
.
更直接
受@ericgio 和@Ryan Cogswell 的启发,有另一种方法可以解决这个问题。对于非原生元素,我们可以为 onClose
分配一个 setTimeout
函数,这将在从菜单中选择选项后模糊元素。
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>
);
};
默认情况下,MaterialUI 的 Select 组件在选择一个选项后会自动聚焦。这种行为可以在他们 docs
中的所有示例中看到我希望元素在被选中后变得模糊。这是我的代码目前的样子:
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
does not exist on type element.
选择选项后模糊我的 Select 组件的正确方法是什么?
将一些评论总结成答案:
正如@2pha 所建议的那样,使用 evt.target.blur()
可能是可行的方法:
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
引用无效,因为 it's being forwarded to the root element(div
)不是 select
元素。
您看到的与 document.activeElement
相关的错误看起来与 TypeScript 相关。您看到它是因为 document.activeElement
一般类型为 Element
,它没有 blur
方法。您需要指定 HTMLSelectElement
类型,但似乎不值得采用该路线,因为仅使用 evt.target
.
受@ericgio 和@Ryan Cogswell 的启发,有另一种方法可以解决这个问题。对于非原生元素,我们可以为 onClose
分配一个 setTimeout
函数,这将在从菜单中选择选项后模糊元素。
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>
);
};