javascript - 如何将变量从 React 中的处理程序传递到其他代码区域?
问题描述
我不是 JS 和 React 的专业人士(大约 2-3 个月前才开始),现在正试图修改我正在工作的项目之一。我的大部分问题都与 React 中的范围有关。下面是我试图将一组对象从 Button onClick 处理程序传递到生成 excel 文件的组件的代码。
处理程序部分是主组件和渲染部分的子组件 - 同一组件的一部分。
处理程序:
const Reports = (props) => { ....
let xlsxFileHandler =() => {
if (dataSource) {
table = document.querySelectorAll("table");
table1=table[0];
table2=table[1];
output = document.querySelector("pre");
data2 = parseTable(table1,table2);
}
}
...
渲染部分:
return (
<>
<Layout> ....
<ExcelFile element={<button>Download Excel 2</button>}>
<ExcelSheet data={data2} name="Employees">
<ExcelColumn label="Name" value="card_number"/>
<ExcelColumn label="Wallet Money" value="controller_address"/>
<ExcelColumn label="Name" value="department_abbreviation"/>
<ExcelColumn label="Name" value="department_name"/>
<ExcelColumn label="Name" value="event_code_code"/>
<ExcelColumn label="Name" value="event_code_name"/>
<ExcelColumn label="Name" value="first_name"/>
<ExcelColumn label="Name" value="id"/>
</ExcelSheet>
</ExcelFile>
……
我无法将 data2 变量传递给渲染部分,它说未定义:
未捕获的类型错误:无法读取未定义的属性“forEach”
at t.value (ExcelFile.js:66)
at ExcelFile.js:96
at D (react.production.min.js:18)
at e (react.production.min.js:17)
at R (react.production.min.js:18)
at Object.forEach (react.production.min.js:20)
at t.value (ExcelFile.js:94)
at Object.s (react-dom.production.min.js:14)
at d (react-dom.production.min.js:14)
at react-dom.production.min.js:14
如果我将 data2 作为回调从渲染传递到处理程序,它说几乎相同并且页面是空白的。如何在运行时访问反应表?据我了解,我不能直接访问 React DOM。
同时我可以 console.log 在点击处理程序中记录 data2:
0: {Фамилия: " ", Имя: " ", Отчество: " ", Департамент: " ", Проходная: " ", ...} "", ...} .....更多数据长度:65 proto : Array (0)
解决方案
您必须将 的值存储data2
在一个状态中。
如果您使用的是类组件。来自https://reactjs.org/docs/state-and-lifecycle.html的示例:
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
如果您使用的是 Function 组件。来自https://reactjs.org/docs/hooks-state.html的示例:
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
状态是 React 组件类的一个实例,可以定义为一组可观察属性的对象,这些属性控制组件的行为。换句话说,组件的状态是一个对象,它包含一些可能在组件的生命周期内发生变化的信息。
我会说状态相当于let
React 组件中的 a。所以如果你需要一个他的值会在组件生命周期内改变的 var,你需要一个 State
推荐阅读
- log4j - 启用以查看 HBASE Accessconroller 的审核跟踪日志
- c# - XElement - 无法捕获下一个节点
- html - bootstrap 4 边框重叠
- javascript - 为什么切换只对更改内容起作用一次?
- c# - 如何从 UserControl1 WPF MVVM 中的按钮将数据从一个 UserControl1 传递到 UserControl2
- android - 第一次未触发自定义视图的焦点侦听器
- python - Python中如何打印“__main__”的帮助说明?
- python - 卷积核如何将具有 3 个通道的图像转换为多个通道?最后一个参数是什么意思?
- java - 使用 .nextLine() 在数组跳行中存储值
- r - 在 R 中使用 ggplot 绘制带有平滑线的条形图