反应不呈现最新价值
react doesn't render latest value
对于初始渲染,我有 object date
,这是一个空数组。然后,我尝试从 influxDB 获取数据,但 React 未使用 re-render 反映获取结果。 get 函数在 useEffect
中调用(您可以在屏幕截图中看到这一点)。我使用打字稿,为了避免在初始加载时出错(数据是 object 的空数组,它没有值 属性),我使用打字稿语法,但它仍然没有显示正确的值。它根本不显示任何内容。
可能是什么问题?在最后一张照片中,我们可以看到另一种显示数据的方式,没有打字稿的问号,但它也不能正常工作,即使数组的长度大于0,它仍然不显示data[0].value
.
初始数据:
DB获取后的数据:
获取数组中的第一个元素:
浏览器结果(在':'之前我们应该看到data[0].value
):
替代方法(当数据不为空时,我们应该看到数组中第一个 object 的值):
我也给我们看代码
import React from 'react';
import './App.css';
import { FluxTableMetaData } from '@influxdata/influxdb-client';
const { InfluxDB } = require('@influxdata/influxdb-client');
export const App = () => {
debugger
const authData = {
token: 'Emyw1rqUDthYRLpmmBc6O1_yt9rGTT57O50zoKiXUoScAjL6G-MgUN6G_U9THilr86BfIPHMYt6_KSDNHhc9Jg==',
org: 'testOrg',
bucket: 'test-bucket',
};
const client = new InfluxDB({
url: 'http://localhost:8086',
token: authData.token,
});
const queryApi = client.getQueryApi(authData.org);
const query = `from(bucket: "${authData.bucket}") |> range(start: -1d)`;
const data: any[] = [];
React.useEffect(() => {
queryApi.queryRows(query, {
next(row: string[], tableMeta: FluxTableMetaData) {
debugger;
const o = tableMeta.toObject(row);
const item = {
time: o._time,
measurement: o._measurement,
field: o._field,
value: o._value,
};
return data.push(item);
},
error(error: Error) {
return error;
},
complete() {
console.log(data)
return data;
},
})
},[]);
debugger;
return (
<div>
<div>{data.length !== data[0].value}:</div>
<div>hello</div>
</div>
);
};
另一种方式:
<div>
<div>{data[0]?.value}:</div>
<div>hello</div>
</div>
我建议您通过以下方式使用 React 状态
var [nameOfVariableWhichWillChange, changeFunction] = React.useState("");
现在,无论哪个函数想要更改该函数的值,只需使用 changeFunction(newValueOfVariable)
使用 React state 的优点是你可能在任何地方使用那个变量来改变那个变量,每个实例都会自己改变......
请告诉我这是否解决了您的问题,或者您还需要其他东西
即使数据已更改,React 也不会重新呈现网页。您需要将数据存储在 React.useState
中并调用 setState
触发重新渲染。
const [data, setData] = useState([])
React.useEffect(() => {
...
next(row: string[], tableMeta: FluxTableMetaData) {
...
setData([...data, item])
},
...
在此处阅读有关 useState
的更多信息:https://reactjs.org/docs/hooks-state.html
代码中的主要问题是,您已将数据定义为 const
变量,而不是 state
。因此,在 useEffect
中,即使您的 data
发生更改,它也不会反映在 data[0].value
上,因为它是一个 const 变量并且 React 不会呈现变量的更新值。它 updates/renders 仅当它是一个状态时。
简而言之,将您的 const
数据转换为 state
并像下面那样使用 setState
让您的代码正常工作!
const [data, setData] = React.useState([]);
...
setData([...data , item]);
对于初始渲染,我有 object date
,这是一个空数组。然后,我尝试从 influxDB 获取数据,但 React 未使用 re-render 反映获取结果。 get 函数在 useEffect
中调用(您可以在屏幕截图中看到这一点)。我使用打字稿,为了避免在初始加载时出错(数据是 object 的空数组,它没有值 属性),我使用打字稿语法,但它仍然没有显示正确的值。它根本不显示任何内容。
可能是什么问题?在最后一张照片中,我们可以看到另一种显示数据的方式,没有打字稿的问号,但它也不能正常工作,即使数组的长度大于0,它仍然不显示data[0].value
.
初始数据:
DB获取后的数据:
获取数组中的第一个元素:
浏览器结果(在':'之前我们应该看到data[0].value
):
替代方法(当数据不为空时,我们应该看到数组中第一个 object 的值):
我也给我们看代码
import React from 'react';
import './App.css';
import { FluxTableMetaData } from '@influxdata/influxdb-client';
const { InfluxDB } = require('@influxdata/influxdb-client');
export const App = () => {
debugger
const authData = {
token: 'Emyw1rqUDthYRLpmmBc6O1_yt9rGTT57O50zoKiXUoScAjL6G-MgUN6G_U9THilr86BfIPHMYt6_KSDNHhc9Jg==',
org: 'testOrg',
bucket: 'test-bucket',
};
const client = new InfluxDB({
url: 'http://localhost:8086',
token: authData.token,
});
const queryApi = client.getQueryApi(authData.org);
const query = `from(bucket: "${authData.bucket}") |> range(start: -1d)`;
const data: any[] = [];
React.useEffect(() => {
queryApi.queryRows(query, {
next(row: string[], tableMeta: FluxTableMetaData) {
debugger;
const o = tableMeta.toObject(row);
const item = {
time: o._time,
measurement: o._measurement,
field: o._field,
value: o._value,
};
return data.push(item);
},
error(error: Error) {
return error;
},
complete() {
console.log(data)
return data;
},
})
},[]);
debugger;
return (
<div>
<div>{data.length !== data[0].value}:</div>
<div>hello</div>
</div>
);
};
另一种方式:
<div>
<div>{data[0]?.value}:</div>
<div>hello</div>
</div>
我建议您通过以下方式使用 React 状态
var [nameOfVariableWhichWillChange, changeFunction] = React.useState("");
现在,无论哪个函数想要更改该函数的值,只需使用 changeFunction(newValueOfVariable)
使用 React state 的优点是你可能在任何地方使用那个变量来改变那个变量,每个实例都会自己改变......
请告诉我这是否解决了您的问题,或者您还需要其他东西
即使数据已更改,React 也不会重新呈现网页。您需要将数据存储在 React.useState
中并调用 setState
触发重新渲染。
const [data, setData] = useState([])
React.useEffect(() => {
...
next(row: string[], tableMeta: FluxTableMetaData) {
...
setData([...data, item])
},
...
在此处阅读有关 useState
的更多信息:https://reactjs.org/docs/hooks-state.html
代码中的主要问题是,您已将数据定义为 const
变量,而不是 state
。因此,在 useEffect
中,即使您的 data
发生更改,它也不会反映在 data[0].value
上,因为它是一个 const 变量并且 React 不会呈现变量的更新值。它 updates/renders 仅当它是一个状态时。
简而言之,将您的 const
数据转换为 state
并像下面那样使用 setState
让您的代码正常工作!
const [data, setData] = React.useState([]);
...
setData([...data , item]);