# React技巧之select标签设置占位符
原文链接:https://bobbyhadz.com/blog/react-placeholder-select (opens new window)
作者:Borislav Hadzhiev (opens new window)
正文从这开始~
# 总览
在React中为select
标签设置占位符:
- 将
select
标签的第一个option
元素设置为disabled
,并给它设置一个空字符串值。 - 初始化
select
标签的state
为空字符串。
// App.js
import {useState} from 'react';
const App = () => {
// 👇️ initial value of empty string (first option)
const [selected, setSelected] = useState('');
const handleChange = event => {
console.log('Label 👉️', event.target.selectedOptions[0].label);
console.log(event.target.value);
setSelected(event.target.value);
};
return (
<div>
<select value={selected} onChange={handleChange}>
<option disabled={true} value="">
--Choose and option--
</option>
<option value="apple">Apple 🍏</option>
<option value="banana">Banana 🍌</option>
<option value="kiwi">Kiwi 🥝</option>
</select>
</div>
);
};
export default App;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
我们成功的为select
标签添加了占位符。
# 设置option标签
需要注意的是,我们初始化selected
状态为''
(空字符串)。
const [selected, setSelected] = useState('');
1
接下来,设置第一个option
标签为disabled
,并给它设置一个空字符串值。
<div>
<select value={selected} onChange={handleChange}>
<option disabled={true} value="">
--Choose and option--
</option>
<option value="apple">Apple 🍏</option>
<option value="banana">Banana 🍌</option>
<option value="kiwi">Kiwi 🥝</option>
</select>
</div>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
第一个option
元素将被展示,但是用户无法使用鼠标或者键盘选择该元素,因为我们设置了disabled
属性为true
。
# 设置change事件
我们在select
元素上设置了onChange
事件,所以每当值有变化的时候,handleChange
函数会被调用。
const handleChange = event => {
console.log('Label 👉️', event.target.selectedOptions[0].label);
console.log(event.target.value);
setSelected(event.target.value);
};
1
2
3
4
5
6
2
3
4
5
6
event
对象上的target
属性是select
元素的引用,因此我们可以使用event.target.value
访问被选中的值。
在handleChange
函数中,我们使用被选择选项的值来更新state
。
# 遍历生成
你也可以将选项添加到一个数组中,并使用map()
方法对其进行迭代,以避免重复操作。
import {useState} from 'react';
const App = () => {
const options = [
{value: '', text: '--Choose an option--', disabled: true},
{value: 'apple', text: 'Apple 🍏'},
{value: 'banana', text: 'Banana 🍌'},
{value: 'kiwi', text: 'Kiwi 🥝'},
];
// 👇️ initial value of empty string (first option)
const [selected, setSelected] = useState('');
const handleChange = event => {
console.log('Label 👉️', event.target.selectedOptions[0].label);
console.log(event.target.value);
setSelected(event.target.value);
};
return (
<div>
<select value={selected} onChange={handleChange}>
{options.map(option => (
<option
disabled={option.disabled}
key={option.value}
value={option.value}
>
{option.text}
</option>
))}
</select>
</div>
);
};
export default App;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
这个例子在一个数组中定义了所有的选项,以便使我们的JSX
代码更加简洁。