我如何解决反应中的单个引用?
How can I resolve a single reference in react?
水果json值。
console.log(fruit)
[
{
content: "apple",
information: [
{
calorie: "122"
},
],
},
{
content: "banana",
information: [
{
calorie: "221"
},
],
},
{
content: "mango",
information: [
{
calorie: "52"
},
],
},
];
通过运行水果信息的地图功能创建按钮
动态创建的按钮是{value.calorie}创建第一个按钮122第二个按钮221第三个按钮52。
并且内容还将函数映射到水果并将{fruit.content}作为按钮中的参数值。
并设置 useRef,以便在单击 value.calorie 按钮时,也单击水果内容按钮。
const Content = useRef(null);
const Calorie = useRef(null);
const onClickContent = (content) => {
console.log(content);
};
const onClickCalorie = (calorie) => {
Content.current.click();
console.log(calorie);
};
return (
<>
fruit.map((Fields, index) => (
<>
<p>{Fields.content}</p>
<button style={{"display": "none"}} ref={Content} onClick={() => onClickContent(Fields.content)}></button>
</>
{Fields.information.map((Value, key) => {
return (
<>
<p>{Value.calorie}</p>
<button onClick={() => onClickCalorie(Value.calorie)}>{Value.calorie}</button>
</>
)
})}
))
</>
)
问题是点击按钮上显示的122时,控制台也输出了内容,应该输出apple,却输出了mango。
如果点击卡路里为221的按钮,应该会输出banan,但是控制台会输出mango。据说这是因为单引用
如何解决单一参考功能?我不知道。
对我来说,您似乎可以删除 ref,因为它目前的用途是在您单击第二个(卡路里)按钮时触发第一个(内容)按钮上的单击事件。如果是这种情况,您可以改为在 onClickCalorie()
内手动调用 onClickContent()
。首先,您可以更新 onClickCalorie()
以传递 onClickContent()
需要的数据:
<button onClick={() => onClickCalorie(Value.calorie, Fields.content)}>{Value.calorie}</button>
然后,在您的 onClickCalorie()
中更新参数,并手动调用 onClickContent()
以触发您在单击“内容”按钮时触发的相同功能:
const onClickCalorie = (calorie, content) => {
onClickContent(content);
// ... do stuff specific to clicking on the calorie button ...
console.log(calorie);
};
这样,您不需要使用任何引用,因为您不需要明确引用任何 DOM 元素。
如果您的 onClickCalorie()
函数只做 call/trigger onClickContent()
,那么您可以删除 onClickCalorie()
函数并直接调用 onClickContent()
:
<button onClick={() => onClickContent(Fields.content)}>{Value.calorie}</button>
否则,如果您真的需要使用 refs,可以按照 为每个按钮创建一个 ref:
const contentBtns = useRef([]);
然后在 useEffect()
中更新数组大小,如果 fruit
数组发生变化:
useEffect(() => {
contentBtns.current = contentBtns.current.slice(0, fruit.length);
}, [fruit]);
然后填充存储在contentBtns.current
中的数组,以便每个索引存储按钮元素:
<button
style={{"display": "none"}}
ref={el => contentBtns.current[index] = el}
onClick={() => onClickContent(Fields.content)}>
</button>
现在当你调用onClickCalorie
时,你可以根据索引引用特定的按钮来点击。您需要将索引传递到 onClickCalorie()
才能访问它:
const onClickCalorie = (calorie, index) => {
contentBtns.current[index].click();
console.log(calorie);
};
水果json值。
console.log(fruit)
[
{
content: "apple",
information: [
{
calorie: "122"
},
],
},
{
content: "banana",
information: [
{
calorie: "221"
},
],
},
{
content: "mango",
information: [
{
calorie: "52"
},
],
},
];
通过运行水果信息的地图功能创建按钮
动态创建的按钮是{value.calorie}创建第一个按钮122第二个按钮221第三个按钮52。
并且内容还将函数映射到水果并将{fruit.content}作为按钮中的参数值。
并设置 useRef,以便在单击 value.calorie 按钮时,也单击水果内容按钮。
const Content = useRef(null);
const Calorie = useRef(null);
const onClickContent = (content) => {
console.log(content);
};
const onClickCalorie = (calorie) => {
Content.current.click();
console.log(calorie);
};
return (
<>
fruit.map((Fields, index) => (
<>
<p>{Fields.content}</p>
<button style={{"display": "none"}} ref={Content} onClick={() => onClickContent(Fields.content)}></button>
</>
{Fields.information.map((Value, key) => {
return (
<>
<p>{Value.calorie}</p>
<button onClick={() => onClickCalorie(Value.calorie)}>{Value.calorie}</button>
</>
)
})}
))
</>
)
问题是点击按钮上显示的122时,控制台也输出了内容,应该输出apple,却输出了mango。
如果点击卡路里为221的按钮,应该会输出banan,但是控制台会输出mango。据说这是因为单引用
如何解决单一参考功能?我不知道。
对我来说,您似乎可以删除 ref,因为它目前的用途是在您单击第二个(卡路里)按钮时触发第一个(内容)按钮上的单击事件。如果是这种情况,您可以改为在 onClickCalorie()
内手动调用 onClickContent()
。首先,您可以更新 onClickCalorie()
以传递 onClickContent()
需要的数据:
<button onClick={() => onClickCalorie(Value.calorie, Fields.content)}>{Value.calorie}</button>
然后,在您的 onClickCalorie()
中更新参数,并手动调用 onClickContent()
以触发您在单击“内容”按钮时触发的相同功能:
const onClickCalorie = (calorie, content) => {
onClickContent(content);
// ... do stuff specific to clicking on the calorie button ...
console.log(calorie);
};
这样,您不需要使用任何引用,因为您不需要明确引用任何 DOM 元素。
如果您的 onClickCalorie()
函数只做 call/trigger onClickContent()
,那么您可以删除 onClickCalorie()
函数并直接调用 onClickContent()
:
<button onClick={() => onClickContent(Fields.content)}>{Value.calorie}</button>
否则,如果您真的需要使用 refs,可以按照
const contentBtns = useRef([]);
然后在 useEffect()
中更新数组大小,如果 fruit
数组发生变化:
useEffect(() => {
contentBtns.current = contentBtns.current.slice(0, fruit.length);
}, [fruit]);
然后填充存储在contentBtns.current
中的数组,以便每个索引存储按钮元素:
<button
style={{"display": "none"}}
ref={el => contentBtns.current[index] = el}
onClick={() => onClickContent(Fields.content)}>
</button>
现在当你调用onClickCalorie
时,你可以根据索引引用特定的按钮来点击。您需要将索引传递到 onClickCalorie()
才能访问它:
const onClickCalorie = (calorie, index) => {
contentBtns.current[index].click();
console.log(calorie);
};