[英]Can't get autocompleted inputs in React.js form with onChange
I have a form with some inputs with onChange={e => handleChange(e)} in them.我有一个表单,其中包含一些带有 onChange={e => handleChange(e)} 的输入。 The problem is that one of them, the ZIP code field, autocompletes other inputs when the user inserts a valid ZIP so the onChange won't be triggered and thus the input value won't be saved.
问题是其中之一,邮政编码字段,当用户插入一个有效的邮政编码时会自动完成其他输入,因此不会触发 onChange,因此不会保存输入值。
//SAVING DATA FROM FORM
const [values, setValues] = useState({})
function handleChange(e) {
setValues({ ...values, [e.target.id]: e.target.value})
}
//AUTOCOMPLETING FROM ZIP
const [address, setAddress] = useState("")
const [neighborhood, setNeighborhood] = useState("")
const [city, setCity] = useState("")
const [state, setState] = useState("")
async function searchZIP(zip) {
zip = zip.replace(/\D/g, "")
const data = await fetch(`http://viacep.com.br/ws/${zip}/json/`)
.then(data => data.json())
.catch(data => data = "")
let { logradouro="--", bairro="--", localidade="--", uf="--" } = data
if(zip.length === 0) logradouro="", bairro="", localidade="", uf=""
setAddress(logradouro)
setNeighborhood(bairro)
setCity(localidade)
setState(uf)
}
//SUBMITING
function handleSubmit(e) {
e.preventDefault()
axios.post("http://localhost:8080", values)
}
You need to trigger input change event programmatically.您需要以编程方式触发输入更改事件。 there is discussion about on react github repo , you can find some useful code snippets from there.
有关于react github repo的讨论,你可以从那里找到一些有用的代码片段。
The most generic solution (taken from here ) is:最通用的解决方案(取自此处)是:
const inputTypes = [
window.HTMLInputElement,
window.HTMLSelectElement,
window.HTMLTextAreaElement,
];
export const triggerInputChange = (node, value = '') => {
// only process the change on elements we know have a value setter in their constructor
if ( inputTypes.indexOf(node.__proto__.constructor) >-1 ) {
const setValue = Object.getOwnPropertyDescriptor(node.__proto__, 'value').set;
const event = new Event('input', { bubbles: true });
setValue.call(node, value);
node.dispatchEvent(event);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.