我在React中做了一个小例子。我遇到的一个问题是,当我将函数引用传递给onClick
事件处理程序时,当执行该事件时,react不会更新组件上的类,也就是说,它没有执行另一个函数在组件中定义。
以下是问题的代码片段。可以在此处找到整个代码段:https://jsfiddle.net/h6k4um9o/
const Numbers = (props) => {
const handleClick = (event) => {
props.selectNumber(event.target.innerText)
}
const numberClassName = (number) => {
if(props.selectedNumbers.indexOf(number) >= 0) {
return 'selected';
}
}
return (
<div className="card text-center">
<div>
{Numbers.list.map((number, index) =>
<span key={index} className={numberClassName(number)}
onClick={handleClick}>{number}</span>
)}
</div>
</div>
);
}
在上面的代码中,当我们将handleClick
引用传递给onClick
时,它将不会应用numberClassName
添加的类。但是,使用内联函数时问题已得到解决。
onClick={() => props.selectNumber(number)}>{number}</span>
对这个问题有任何想法吗?
提前致谢。
答案 0 :(得分:1)
您的handleClick
函数需要一个数字,并且您正在传递一个字符串。如果将其更改为
const handleClick = (event) => {
props.selectNumber(Number(event.target.innerText))
}
答案 1 :(得分:1)
这是因为event.target.innerText
是一个字符串,而您使用indexOf
来返回数字类名称。
indexOf()使用strict将searchElement与Array的元素进行比较 等式(与===或三等号运算符使用的方法相同)。
这意味着它会检查类型和相等性。
例如:
console.log("0" == 0); // true
console.log("0" === 0); //false
&#13;
所以你只需要这样做:
const handleClick = (event) => {
props.selectNumber(parseInt(event.target.innerText));
}
并且您的代码在没有内联函数的情况下也能正常工作。
答案 2 :(得分:1)
SelectNumber需要数字类型,但您传递的是字符串类型。 event.target.innerText返回字符串。
使用Number Constructor转换字符串。
const handleClick = (event) => {
props.selectNumber(Number(event.target.innerText));
}
答案 3 :(得分:1)