<select>
メニューのReactコンポーネントでは、アプリケーションの状態を反映するオプションにselected
属性を設定する必要があります。
render()
では、optionState
が州の所有者からSortMenuコンポーネントに渡されます。オプションの値はJSONからprops
として渡されます。
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.Push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
しかしそれはJSXコンパイルで構文エラーを引き起こします。
こうすることで構文エラーが取り除かれますが、明らかに問題は解決しません。
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
私もこれを試しました:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
これを解決するための推奨される方法はありますか?
Reactはこの目的のためにブール値を自動的に理解するので、単純に と書くことができます(注:お勧めしません)
<option value={option.value} selected={optionsState == option.value}>{option.label}</option>
そしてそれは適切に 'selected'を出力します。
しかし、Reactはこれをさらに簡単にします。各オプションにselected
を定義する代わりに、 あなたは単にselectタグ自体にvalue={optionsState}
を書くことができます(そしてそうすべきです) :
<select value={optionsState}>
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
詳細については、 React select tag doc を参照してください。
<option>
の "selected"プロパティを設定しようとしたときにReactが警告することを行うことができます。
<select>
にdefaultValue
を設定する代わりに、<option>
にvalue
またはselected
の小道具を使用してください。
そのため、あなたはあなたのselectのdefaultValue
にoptions.value
を使うことができます。
これがベストアンサーとその下のコメントを組み込んだ完全な解決策です(これは誰かがそれをまとめるのに苦労しているのを助けるかもしれません):
ES6用の更新プログラム(2019) - 矢印関数とオブジェクトの分解
主成分で:
class ReactMain extends React.Component {
constructor(props) {
super(props);
this.state = { fruit: props.item.fruit };
}
handleChange = (event) => {
this.setState({ [event.target.name]: event.target.value });
}
saveItem = () => {
const item = {};
item.fruit = this.state.fruit;
// do more with item object as required (e.g. save to database)
}
render() {
return (
<ReactExample name="fruit" value={this.state.fruit} handleChange={this.handleChange} />
)
}
}
含まれているコンポーネント(現在はステートレス関数です):
export const ReactExample = ({ name, value, handleChange }) => (
<select name={name} value={value} onChange={handleChange}>
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
)
前の回答(バインドを使用)
主成分で:
class ReactMain extends React.Component {
constructor(props) {
super(props);
// bind once here, better than multiple times in render
this.handleChange = this.handleChange.bind(this);
this.state = { fruit: props.item.fruit };
}
handleChange(event) {
this.setState({ [event.target.name]: event.target.value });
}
saveItem() {
const item = {};
item.fruit = this.state.fruit;
// do more with item object as required (e.g. save to database)
}
render() {
return (
<ReactExample name="fruit" value={this.state.fruit} handleChange={this.handleChange} />
)
}
}
含まれているコンポーネント(現在はステートレス関数です):
export const ReactExample = (props) => (
<select name={props.name} value={props.value} onChange={props.handleChange}>
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
)
メインコンポーネントはfruitの選択された値を(状態で)維持し、インクルードコンポーネントはselect要素を表示し、更新はメインコンポーネントに渡されてその状態を更新します(その後、選択された値を変更するためにインクルードコンポーネントに戻ります)。
型にかかわらず、同じフォーム上の他のフィールドに対して単一のhandleChangeメソッドを宣言できる名前propを使用していることに注意してください。
選択タグの最初のオプションとして追加するだけです。
<option disabled hidden value=''></option>
これはデフォルトになり、あなたが有効なオプションを選択したときにあなたの状態に設定されます
これを行う方法の最新の例はここにあります。 反応ドキュメント に加えて、自動結合の "fat-arrow"メソッドの文法。
class FlavorForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'coconut'};
}
handleChange = (event) =>
this.setState({value: event.target.value});
handleSubmit = (event) => {
alert('Your favorite flavor is: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Pick your favorite flavor:
<select value={this.state.value} onChange={this.handleChange}>
<option value="grapefruit">Grapefruit</option>
<option value="Lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
状態が変わったときに<select>
タグが正しい<option>
に更新されないという問題がありました。私の問題は、最初に<option>
を選択せずに2回連続して2回すばやく連続してレンダリングした場合、<select>
タグは2回目のレンダリングでは更新されず、デフォルトのままになるということです。
refs を使用してこれに対する解決策を見つけました。あなたはあなたの<select>
タグノードへの参照を取得する必要があります(それは何らかのコンポーネントにネストされるかもしれません)、そしてそれからvalue
プロパティでそれの上のcomponentDidUpdate
プロパティを手動で更新します。
componentDidUpdate(){
let selectNode = React.findDOMNode(this.refs.selectingComponent.refs.selectTag);
selectNode.value = this.state.someValue;
}
***Html:***
<div id="divContainer"></div>
var colors = [{ Name: 'Red' }, { Name: 'Green' }, { Name: 'Blue' }];
var selectedColor = 'Green';
ReactDOM.render(<Container></Container>, document.getElementById("divContainer"));
var Container = React.createClass({
render: function () {
return (
<div>
<DropDown data={colors} Selected={selectedColor}></DropDown>
</div>);
}
});
***Option 1:***
var DropDown = React.createClass(
{
render: function () {
var items = this.props.data;
return (
<select value={this.props.Selected}>
{
items.map(function (item) {
return <option value={item.Name }>{item.Name}</option>;
})
}
</select>);
}
});
***Option 2:***
var DropDown = React.createClass(
{
render: function () {
var items = this.props.data;
return (
<select>
{
items.map(function (item) {
return <option value={item.Name} selected={selectedItem == item.Name}>{item.Name}</option>;
})
}
</select>);
}
});
***Option 3:***
var DropDown = React.createClass(
{
render: function () {
var items = this.props.data;
return (
<select>
{
items.map(function (item) {
if (selectedItem == item.Name)
return <option value={item.Name } selected>{item.Name}</option>;
else
return <option value={item.Name }>{item.Name}</option>;
})
}
</select>);
}
});
MULTISELECT/optgroupsについて同様の答えを投稿する:
render() {
return(
<div>
<select defaultValue="1" onChange={(e) => this.props.changeHandler(e.target.value) }>
<option disabled="disabled" value="1" hidden="hidden">-- Select --</option>
<optgroup label="Group 1">
{options1}
</optgroup>
<optgroup label="Group 2">
{options2}
</optgroup>
</select>
</div>
)
}
私は簡単な解決策はHTMLの基本に従うことです。
<input
type="select"
defaultValue=""
>
<option value="" disabled className="text-hide">Please select</option>
<option>value1</option>
<option>value1</option>
</input>
.text-hide
はブートストラップのクラスです。ブートストラップを使用しない場合は、次のようになります。
.text-hide {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}