未呈现更新的变量
Updated variable is not rendered
我正在使用 React。
import React from 'react';
function Scheduler(props) {
var remainingHours = 5;
const TimelineHeaderItem = () => {
remainingHours = 8;
console.log(remainingHours) // prints 8
return <></>;
}
const name = () => {
console.log('fetching remaining hours=>', remainingHours); // prints 5
}
return (
<>
<TimelineHeaderItem />
{name()}
</>
);
}
export default Scheduler;
如您所见,我在TimelineHeaderItem
中将remainingHours
的值改为了8。
但是当我在 name
函数中访问该值时,它会打印 5
,这是前一个。
为什么会这样?以及如何访问更新后的值。
普通变量不会创建重新渲染。
状态变量是负责告诉 react 重新渲染的变量之一
At the time, when TimelineHeaderItem
updated the variable, the state has already rendered and the name
function has already called, so you cant see the variable value change.
这是console.log()
的结果
您必须将变量用作 state
变量,因为它们会导致重新渲染。
import React, {useState, useEffect} from 'react';
function Scheduler(props) {
const [remainingHours, setHours] = useState(5); //<-- this is state
const TimelineHeaderItem = () => {
setHours(8);
console.log(remainingHours) // prints 8
}
useEffect(() => {
TimelineHeaderItem(); //<-- this is useEffect, it runs on first render if provided with no dependecies
},[]);
const name = () => {
console.log('fetching remaining hours=>', remainingHours); // prints 5
}
return (
<>
{/*<TimelineHeaderItem /> <--- No need of this now */}
{name()}
</>
);
}
您可以在此处阅读有关钩子及其功能的更多信息 https://reactjs.org/docs/hooks-state.html
导出默认调度程序;
在 React 中,屏幕上显示的内容应该来自组件的状态。改变组件的状态告诉 React 重新渲染组件。简单地重新分配一个变量本身,就像你正在做的那样,没有副作用。
此外,TimelineHeaderItem
没有任何意义 - 它没有返回任何内容。如果您希望它更改 remainingHours
,请为此使用普通函数,而不是尝试将其呈现为组件。
类似地,如果您希望 name
在屏幕上显示剩余时间,请将其作为一个组件而不是在 JSX 中调用它。 (或者完全删除它,然后将 remainingHours
插入 JSX。)类似于:
const App = () => {
const [remainingHours, setRemainingHours] = React.useState(5);
const changeHours = () => setRemainingHours(8);
return <div>
<button onClick={changeHours}>click</button>
<div>{remainingHours}</div>
</div>;
};
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
我正在使用 React。
import React from 'react';
function Scheduler(props) {
var remainingHours = 5;
const TimelineHeaderItem = () => {
remainingHours = 8;
console.log(remainingHours) // prints 8
return <></>;
}
const name = () => {
console.log('fetching remaining hours=>', remainingHours); // prints 5
}
return (
<>
<TimelineHeaderItem />
{name()}
</>
);
}
export default Scheduler;
如您所见,我在TimelineHeaderItem
中将remainingHours
的值改为了8。
但是当我在 name
函数中访问该值时,它会打印 5
,这是前一个。
为什么会这样?以及如何访问更新后的值。
普通变量不会创建重新渲染。
状态变量是负责告诉 react 重新渲染的变量之一
At the time, when
TimelineHeaderItem
updated the variable, the state has already rendered and thename
function has already called, so you cant see the variable value change.
这是console.log()
您必须将变量用作 state
变量,因为它们会导致重新渲染。
import React, {useState, useEffect} from 'react';
function Scheduler(props) {
const [remainingHours, setHours] = useState(5); //<-- this is state
const TimelineHeaderItem = () => {
setHours(8);
console.log(remainingHours) // prints 8
}
useEffect(() => {
TimelineHeaderItem(); //<-- this is useEffect, it runs on first render if provided with no dependecies
},[]);
const name = () => {
console.log('fetching remaining hours=>', remainingHours); // prints 5
}
return (
<>
{/*<TimelineHeaderItem /> <--- No need of this now */}
{name()}
</>
);
}
您可以在此处阅读有关钩子及其功能的更多信息 https://reactjs.org/docs/hooks-state.html 导出默认调度程序;
在 React 中,屏幕上显示的内容应该来自组件的状态。改变组件的状态告诉 React 重新渲染组件。简单地重新分配一个变量本身,就像你正在做的那样,没有副作用。
此外,TimelineHeaderItem
没有任何意义 - 它没有返回任何内容。如果您希望它更改 remainingHours
,请为此使用普通函数,而不是尝试将其呈现为组件。
类似地,如果您希望 name
在屏幕上显示剩余时间,请将其作为一个组件而不是在 JSX 中调用它。 (或者完全删除它,然后将 remainingHours
插入 JSX。)类似于:
const App = () => {
const [remainingHours, setRemainingHours] = React.useState(5);
const changeHours = () => setRemainingHours(8);
return <div>
<button onClick={changeHours}>click</button>
<div>{remainingHours}</div>
</div>;
};
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>