如何在 Redux Form 的 FieldArray 中填充 select 选项并过滤第二个 select?
How to fill select options and filter the second select in FieldArray in Redux Form?
第一个 select,当 selected 时,应该过滤第二个,或者通过对 Api 的请求流行。
我遇到的问题是,当进入第二个字段时,状态共享给选项,而当修改任何字段时,修改所有选项。
class FieldCentroCusto extends Component {
constructor(){
super()
this.state = {
itensObra: []
}
this.toggleItens = this.toggleItens.bind(this)
}
toggleItens(event) {
this.props.optionsObras.map(obra => {
if (event.target.value === obra.nome) {
return this.setState({
itensObra: obra.itens
})
}
return false
})
}
render() {
const renderItens = ({ fields, optionsObras }) => (
<div>
<Button color="primary" type="button" onClick={() => fields.push({})}>
<i className="fa fa-plus"></i> Adicionar Item de Custo
</Button>
<br /><br />
<table className="table table-bordered table-hover">
<thead className="thead-inverse">
<tr>
<th>Obra</th>
<th>Centro de Custo</th>
</tr>
</thead>
<tbody>
{fields.map((item, itemIndex) =>
<tr key={itemIndex}>
<td>
<Field name={`${item}.obra`} component={LabelAndSelect}
onChange={this.toggleItens} options={
optionsObras.map((option, optionIndex) => {
return {value: `${option.nome === undefined?'':
option.nome}`, label: `${option.nome === undefined?'':
option.nome}`}
}
)} />
</td>
<td>
<Field name={`${item}.itemObra`} component={LabelAndSelect}
options={this.state.itensObra.map((option, optionIndex) => {
return {value: `${option.descricao === undefined?'':
option.descricao}`, label: `${option.descricao === undefined?'':
option.descricao}`}
}
)} />
</td>
</tr>
)}
</tbody>
</table>
</div>
)
return (
<FieldArray name="centrosCusto"
optionsObras={this.props.optionsObras}
component={renderItens} />
)
}
}
我整理好了。
我在选择的 onChange 事件中传递了 FieldArray 索引,并且在我放置具有传递索引的数组的状态下。所以我可以用数组中的特定索引填充其他选择选项。
constructor(){
super()
this.state = {
itensObra: []
}
this.toggleItens = this.toggleItens.bind(this)
}
toggleItens(event, index) {
const itens = this.state.itensObra
this.props.optionsObras.map(obra => {
if (event.target.value === obra.nome) {
itens[index] = obra.itens
return this.setState({
itensObra: itens
})
}
return false
})
}
字段如下:
<td>
<Field name={`${item}.obra`} component={LabelAndSelect}
onChange={(event) => this.toggleItens(event, itemIndex)}
options={optionsObras.map((option, optionIndex) => {
return {value: `${option.nome === undefined?'':option.nome}`,
label:`${option.nome === undefined?'':option.nome}`}
}
)} />
</td>
<td>
<Field name={`${item}.itemObra`} component={LabelAndSelect}
options={this.state.itensObra[itemIndex]?
this.state.itensObra[itemIndex].map((option, optionIndex) => {
return {value: `${option.descricao === undefined?'':option.descricao}`,
label: `${option.descricao === undefined?'':option.descricao}`}
}
):[]} />
</td>
第一个 select,当 selected 时,应该过滤第二个,或者通过对 Api 的请求流行。
我遇到的问题是,当进入第二个字段时,状态共享给选项,而当修改任何字段时,修改所有选项。
class FieldCentroCusto extends Component {
constructor(){
super()
this.state = {
itensObra: []
}
this.toggleItens = this.toggleItens.bind(this)
}
toggleItens(event) {
this.props.optionsObras.map(obra => {
if (event.target.value === obra.nome) {
return this.setState({
itensObra: obra.itens
})
}
return false
})
}
render() {
const renderItens = ({ fields, optionsObras }) => (
<div>
<Button color="primary" type="button" onClick={() => fields.push({})}>
<i className="fa fa-plus"></i> Adicionar Item de Custo
</Button>
<br /><br />
<table className="table table-bordered table-hover">
<thead className="thead-inverse">
<tr>
<th>Obra</th>
<th>Centro de Custo</th>
</tr>
</thead>
<tbody>
{fields.map((item, itemIndex) =>
<tr key={itemIndex}>
<td>
<Field name={`${item}.obra`} component={LabelAndSelect}
onChange={this.toggleItens} options={
optionsObras.map((option, optionIndex) => {
return {value: `${option.nome === undefined?'':
option.nome}`, label: `${option.nome === undefined?'':
option.nome}`}
}
)} />
</td>
<td>
<Field name={`${item}.itemObra`} component={LabelAndSelect}
options={this.state.itensObra.map((option, optionIndex) => {
return {value: `${option.descricao === undefined?'':
option.descricao}`, label: `${option.descricao === undefined?'':
option.descricao}`}
}
)} />
</td>
</tr>
)}
</tbody>
</table>
</div>
)
return (
<FieldArray name="centrosCusto"
optionsObras={this.props.optionsObras}
component={renderItens} />
)
}
}
我整理好了。
我在选择的 onChange 事件中传递了 FieldArray 索引,并且在我放置具有传递索引的数组的状态下。所以我可以用数组中的特定索引填充其他选择选项。
constructor(){
super()
this.state = {
itensObra: []
}
this.toggleItens = this.toggleItens.bind(this)
}
toggleItens(event, index) {
const itens = this.state.itensObra
this.props.optionsObras.map(obra => {
if (event.target.value === obra.nome) {
itens[index] = obra.itens
return this.setState({
itensObra: itens
})
}
return false
})
}
字段如下:
<td>
<Field name={`${item}.obra`} component={LabelAndSelect}
onChange={(event) => this.toggleItens(event, itemIndex)}
options={optionsObras.map((option, optionIndex) => {
return {value: `${option.nome === undefined?'':option.nome}`,
label:`${option.nome === undefined?'':option.nome}`}
}
)} />
</td>
<td>
<Field name={`${item}.itemObra`} component={LabelAndSelect}
options={this.state.itensObra[itemIndex]?
this.state.itensObra[itemIndex].map((option, optionIndex) => {
return {value: `${option.descricao === undefined?'':option.descricao}`,
label: `${option.descricao === undefined?'':option.descricao}`}
}
):[]} />
</td>