2 TypeError: Cannot read properties of undefined (reading 'value') in reactjs with event handler
2 TypeError: Cannot read properties of undefined (reading 'value') in reactjs with event handler
我的代码有什么问题?
我有两个 - 类型错误:无法读取未定义的属性(读取 'value')
预期行为 = 单击一个按钮,按钮使用 class 名称红色并调用函数 addValue 如果我再次单击此按钮,它应该调用函数 removeValue 并且它的颜色应该变为白色。
相反,我得到了这个类型错误,每个按钮都以红色突出显示。
const [color, setColor] = useState(false)
function addValue(e) {
> 38 | if (e.target.value !== "") {
function removeValue(e, value) {
> 63 | if (e.target.value !== "") {
这些是函数
function addValue(e) {
if (e.target.value !== "") {
if (!favs.includes(e.target.value)) {
favs.push(e.target.value);
localStorage.setItem("name", JSON.stringify(favs));
console.log(favs);
document.getElementById("favsarray").innerHTML = favs
}
}
}
function removeValue(e, value) {
if (e.target.value !== "") {
//delete from array
favs.pop(e.target.value);
console.log(favs);
//change the div text
document.getElementById("favsarray").innerHTML = favs;
//get the values from localstorage- parse
const stored = JSON.parse(localStorage.getItem("name"));
//delete the value
delete stored[(value, e.target.value)];
//store the new array as a string
localStorage.setItem("name", JSON.stringify(favs));
console.log(stored);
}
}
我用这个和一个事件处理程序调用这个函数
function addOrRemove(e) {
const elem = e.currentTarget;
setColor(!color)
if (color){
addValue(elem)
} else {
removeValue(elem)
}
}
<button
id="btn"
onClick={addOrRemove}
className={color? "white": "red"}
value={"Name: " + d.name + " Description: " + d.description + " Stars: " + d.stargazers_count + " URL: " + d.html_url}
您只需要将两个有问题的地方的 e.target.value
替换为 e.value
。
这是因为 e
是函数的参数,您是这样调用的:
addValue(elem);
之后
const elem = e.currentTarget;
其中 e
是事件处理函数的参数。所以 elem
是事件处理程序当前触发的 DOM 元素,因此这就是函数内部的 e
。 DOM 元素没有 target
属性,但是 - 如果它们是按钮或输入 - 它们确实有 value
属性。
如果您将参数称为 elem
(您在调用时使用)或 element
(完整)而不是 e
,也会更清楚,按照惯例,它用于事件对象,这可能会让您感到困惑。
我的代码有什么问题?
我有两个 - 类型错误:无法读取未定义的属性(读取 'value')
预期行为 = 单击一个按钮,按钮使用 class 名称红色并调用函数 addValue 如果我再次单击此按钮,它应该调用函数 removeValue 并且它的颜色应该变为白色。
相反,我得到了这个类型错误,每个按钮都以红色突出显示。
const [color, setColor] = useState(false)
function addValue(e) {
> 38 | if (e.target.value !== "") {
function removeValue(e, value) {
> 63 | if (e.target.value !== "") {
这些是函数
function addValue(e) {
if (e.target.value !== "") {
if (!favs.includes(e.target.value)) {
favs.push(e.target.value);
localStorage.setItem("name", JSON.stringify(favs));
console.log(favs);
document.getElementById("favsarray").innerHTML = favs
}
}
}
function removeValue(e, value) {
if (e.target.value !== "") {
//delete from array
favs.pop(e.target.value);
console.log(favs);
//change the div text
document.getElementById("favsarray").innerHTML = favs;
//get the values from localstorage- parse
const stored = JSON.parse(localStorage.getItem("name"));
//delete the value
delete stored[(value, e.target.value)];
//store the new array as a string
localStorage.setItem("name", JSON.stringify(favs));
console.log(stored);
}
}
我用这个和一个事件处理程序调用这个函数
function addOrRemove(e) {
const elem = e.currentTarget;
setColor(!color)
if (color){
addValue(elem)
} else {
removeValue(elem)
}
}
<button
id="btn"
onClick={addOrRemove}
className={color? "white": "red"}
value={"Name: " + d.name + " Description: " + d.description + " Stars: " + d.stargazers_count + " URL: " + d.html_url}
您只需要将两个有问题的地方的 e.target.value
替换为 e.value
。
这是因为 e
是函数的参数,您是这样调用的:
addValue(elem);
之后
const elem = e.currentTarget;
其中 e
是事件处理函数的参数。所以 elem
是事件处理程序当前触发的 DOM 元素,因此这就是函数内部的 e
。 DOM 元素没有 target
属性,但是 - 如果它们是按钮或输入 - 它们确实有 value
属性。
如果您将参数称为 elem
(您在调用时使用)或 element
(完整)而不是 e
,也会更清楚,按照惯例,它用于事件对象,这可能会让您感到困惑。