【问题标题】:REACT.JS - Select/Option is not being displayed how it should [duplicate]REACT.JS - 选择/选项没有显示它应该如何[重复]
【发布时间】:2020-05-19 16:43:22
【问题描述】:

这可能很简单,但我就是看不出我做错了什么。

当我选择其他option 时,option 没有改变,但状态正在更新。

我有三个组件,一个基于类(OrcConfig)和两个函数组件(salvarOrcamento 和 orcSelect)。第一个拥有我的逻辑并控制状态,第二个从DB 获取一些数据并将其发送到第三个,其中select 标签和options 的列表由两个map 创建方法,第一个创建selects 的数量,第二个打印它们各自的select 中的选项列表。

到目前为止一切顺利,问题是当我更改optionDOM 没有更新,但state 实际上只有在更新state 时才会发生,如果我删除了this.setState,问题就消失了,当然这不是解决方案,因为我需要更新state。除此之外,我只是看不到stateselect 之间的关系,因为component 甚至没有收到它的值,它只能访问该方法。

这里(或左边)缺少什么?

这是我的应用程序的简化版本:

OrcConfig 组件:

class OrcConfig extends Component {

state = {
    cliente: null

}

selecionarClienteHandler = e => {
    let clienteNome = this.state.cliente;
    clienteNome = e.currentTarget.value.split(',').filter(it => it !== '').join();
    this.setState({cliente: clienteNome});
    console.log(clienteNome)
}

render () {
    return (
        <div>
            <SalvarOrcamento 
                selecionarCliente={this.selecionarClienteHandler}
            />
        </div>
    );
  }
}

SalvarOrcamento 组件:

const salvarOrcamento = props => {

let [clientes, setClientes] = React.useState(null)

React.useEffect(() => {
    axios.get('/clientes.json')
        .then(res => {

            let clientesListaArr = Object.keys(res.data)
                                    .map(it => [['nome', it]])

            clientesListaArr.unshift([['nome', 'Clientes']])

            let clientesLista = clientesListaArr.map(it => Object.fromEntries(it))

            setClientes(clientes = clientesLista)
        })
        .catch(erro => console.log(erro))
}, [])

return (
    <div>
        <OrcSelect tipos={[clientes]} valorTipo={props.selecionarCliente} />
    </div>
  )
}

OrcSelect 组件:

const orcSelect = props => {
console.log(props.tipos)
return (
    props.tipos.map( (tipo, i) => {
        return  <select 
                    key={Math.random()} 
                    onChange={props.valorTipo} 
                    name={tipo[0].nome}>

                    {
                        tipo.map((item, index) => 
                            <option 
                                value={[item.valor, item.altura, item.nome, item.furo]} 
                                key={Math.random()} >{item.nome}
                            </option>
                        )
                    }
                </select>
    })
  )


};

这是 OrcSelect 接收映射的示例:

[[
   {nome: 'João'},
   {nome: 'Ricardo'},
   {nome: 'Alessandra'},
   {nome: 'Ana'}
]]

【问题讨论】:

  • 您使用 Math.random() 作为映射选项中的键。为什么?关键是让 React 识别哪个 JSX 元素与哪个数组条目一起使用。通过在那里使用Math.random(),每次渲染时每个元素的键都会改变,这意味着它和没有键一样糟糕。键应该是一个唯一 值,可以一致地标识元素。
  • 另外,您没有选择列表的值。您只需为该选项设置一个值。当您更改选择列表中值的状态时,组件将重新呈现。
  • 这能回答你的问题吗? OnChange event using React JS for drop down
  • 有效吗?您还希望我在答案中发布示例吗?

标签: javascript html arrays reactjs dom


【解决方案1】:

问题在于,当您更改状态时,您的 DOM 将被重新渲染。要解决此问题,您需要将 value 属性添加到 select 中,以分配当前所选选项的值。将新属性传递给您的组件

【讨论】:

  • 有道理。自从您回答以来,我正在尝试这样做,但我就是不明白。如果不更新状态,我怎么能做到这一点?我还将值作为道具传递给我的组件,但它似乎没有任何效果。对不起,如果这些是愚蠢的问题,但我对 React 真的很陌生
  • 您需要将 e.currenttarget.value 保存到状态而不改变它。将此值 ex this.state.clienteval 传递给 SalvarOrcamento 组件,而不是您需要对 OrcSelect 组件的道具,最后在选择中,您需要使用从顶部传递的值添加 value 属性。传递的值必须与您分配给选项值属性的值相同
  • 我理解并做到了。但最终问题出在keys。我使用Math.random 作为临时解决方案,React 无法识别我的组件真正发生了什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2012-12-23
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多