到达 useRef() Current 属性 return 未识别,但在 Div 中添加子元素时使用 UseEffect 触发
Reach useRef() Current property return unidentified though using UseEffect to fire when adding a child element inside a Div
我不熟悉 React 和理解 React Hooks,我正在创建一个小应用程序,我在其中使用添加 Div 元素动态创建 Bar。为此,我使用 useRef() 和 UseEffect() 在 div 元素的每次更改后进行渲染,尽管我知道初始值设置为 null 这就是它返回未识别值的原因,但我真的很想了解我如何初始化或任何解决方法。下面是我的代码
import React from "react";
import { useRef, useEffect, useState } from "react";
import "./ExpenseFilter.css";
const ExpenseFilter = (props) => {
const values = [100, 100, 340, 320, 500, 50, 45, 385, 95, 120, 90, 20];
const [refState, setrefState] = useState();
const ref = useRef();
useEffect(() => {
console.log(ref.current);
}, [refState]);
const drawChart = (data, padding) => {
const max = Math.max.apply(Math, data);
const chart = ref.current;
console.log(chart);
const barwidth =
(chart.offsetWidth - (values.length - 1) * padding - data.length * 10) /
data.length;
console.log(barwidth);
let left = 0;
for (let i in data) {
let newbar = document.createElement("div");
newbar.setAttribute("class", "bar");
newbar.style.width = barwidth + "px";
newbar.style.height = (data[i] / max) * 100 + "%";
newbar.style.left = left + "px";
chart.appendChild(newbar);
left += barwidth + padding + 10;
props.OnChangeDiv(newbar);
}
};
drawChart(values, 15);
return (
<div className="wrapper1">
<div className="select" tabIndex="1">
<input
className="selectopt"
name="test"
type="radio"
id="opt1"
checked
/>
<label for="opt1" class="option">
2019
</label>
<input className="selectopt" name="test" type="radio" id="opt2" />
<label for="opt2" class="option">
2020
</label>
<input className="selectopt" name="test" type="radio" id="opt3" />
<label for="opt3" class="option">
2021
</label>
<input className="selectopt" name="test" type="radio" id="opt4" />
<label for="opt4" class="option">
2022
</label>
<input className="selectopt" name="test" type="radio" id="opt5" />
<label for="opt5" class="option">
2023
</label>
</div>
<div
id="chart"
ref={(el) => {
setrefState(el);
}}
></div>
</div>
);
};
export default ExpenseFilter;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
您使用引用的方式有问题。
const ref = useRef()
...
<div ref={ref}>Example</div>
// ref.current is now <div>Example</div>
感谢您对此进行调查,我自己解决了这个问题。因此,正如我之前所说,分配给 useRef() 的初始值是空的,我们都知道这就是当前 属性 被设置为未识别的原因。我所做的是我在 ref 上设置了一个条件,如果它是未识别的,那么它应该 return 并使用 useState 钩子来触发捕获状态,一旦状态发生变化,它就会触发 useEffect() 重新 -呈现当前状态。
useEffect(() => {
if (!ref.current) {
return;
}
ref.current = refState;
console.log(ref.current);
}, [refState]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div
id="chart"
ref={(el) => {
ref.current = el;
setrefState(el);
}}
></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
如果裁判使用下一个州
我不熟悉 React 和理解 React Hooks,我正在创建一个小应用程序,我在其中使用添加 Div 元素动态创建 Bar。为此,我使用 useRef() 和 UseEffect() 在 div 元素的每次更改后进行渲染,尽管我知道初始值设置为 null 这就是它返回未识别值的原因,但我真的很想了解我如何初始化或任何解决方法。下面是我的代码
import React from "react";
import { useRef, useEffect, useState } from "react";
import "./ExpenseFilter.css";
const ExpenseFilter = (props) => {
const values = [100, 100, 340, 320, 500, 50, 45, 385, 95, 120, 90, 20];
const [refState, setrefState] = useState();
const ref = useRef();
useEffect(() => {
console.log(ref.current);
}, [refState]);
const drawChart = (data, padding) => {
const max = Math.max.apply(Math, data);
const chart = ref.current;
console.log(chart);
const barwidth =
(chart.offsetWidth - (values.length - 1) * padding - data.length * 10) /
data.length;
console.log(barwidth);
let left = 0;
for (let i in data) {
let newbar = document.createElement("div");
newbar.setAttribute("class", "bar");
newbar.style.width = barwidth + "px";
newbar.style.height = (data[i] / max) * 100 + "%";
newbar.style.left = left + "px";
chart.appendChild(newbar);
left += barwidth + padding + 10;
props.OnChangeDiv(newbar);
}
};
drawChart(values, 15);
return (
<div className="wrapper1">
<div className="select" tabIndex="1">
<input
className="selectopt"
name="test"
type="radio"
id="opt1"
checked
/>
<label for="opt1" class="option">
2019
</label>
<input className="selectopt" name="test" type="radio" id="opt2" />
<label for="opt2" class="option">
2020
</label>
<input className="selectopt" name="test" type="radio" id="opt3" />
<label for="opt3" class="option">
2021
</label>
<input className="selectopt" name="test" type="radio" id="opt4" />
<label for="opt4" class="option">
2022
</label>
<input className="selectopt" name="test" type="radio" id="opt5" />
<label for="opt5" class="option">
2023
</label>
</div>
<div
id="chart"
ref={(el) => {
setrefState(el);
}}
></div>
</div>
);
};
export default ExpenseFilter;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
您使用引用的方式有问题。
const ref = useRef()
...
<div ref={ref}>Example</div>
// ref.current is now <div>Example</div>
感谢您对此进行调查,我自己解决了这个问题。因此,正如我之前所说,分配给 useRef() 的初始值是空的,我们都知道这就是当前 属性 被设置为未识别的原因。我所做的是我在 ref 上设置了一个条件,如果它是未识别的,那么它应该 return 并使用 useState 钩子来触发捕获状态,一旦状态发生变化,它就会触发 useEffect() 重新 -呈现当前状态。
useEffect(() => {
if (!ref.current) {
return;
}
ref.current = refState;
console.log(ref.current);
}, [refState]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div
id="chart"
ref={(el) => {
ref.current = el;
setrefState(el);
}}
></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
如果裁判使用下一个州