显示保存在 useRef 变量中的值

display value saved in useRef variable

我有一个变量

const prediction = useRef<any>(null);

我单击了一个按钮,该按钮运行一个设置变量值的函数:

    function showResult() {
        classifier.current.classify(capture, (result) => {
            prediction.current = result[0].label
            console.log('prediction.current', prediction.current)

        });
    }

在控制台日志中,我看到 prediction.current 的正确值。但是,当我尝试在 JSX 中呈现它时,我什么也得不到。我可以做些什么来改变它?

如果我在 classifier.current.classifyfunction 中使用 setState,它会给我带来不同。这是一个 ml5 函数。有替代方法吗?我能以某种方式在函数之外设置状态吗?可以使用 Effect 吗?

    return (
    <div>
            <Button variant="contained" color="primary" onClick={() => gotResult()}>Test!</Button>
            <br />
            <span>Prediction: {prediction.current}</span><br />
        </div>
    </div>)
    //const [prediction, setPrediction] = useState<string>();
    //const [confidence, setConfidence] = useState<string>();
    //const [imageClassifier, setClassifier] = useState<any>();

    let capture: p5Types.Element;
    const classifier = useRef<any>(null);
    const prediction = useRef<any>(null);
    const confidence = useRef<any>(null);
    const setup = (p5: p5Types, canvasParentRef: Element) => {
        capture = p5.createCapture(p5.VIDEO).parent(canvasParentRef);
        const featureExtractor = ml5.featureExtractor('MobileNet', modelReady);
        classifier.current = featureExtractor.classification(capture, videoReady);
        console.log('start', classifier);
    }

    function showResult() {
        console.log('classifier in results', classifier);
        classifier.current.classify(capture, (result) => {
            prediction.current = result[0].label;
            console.log(result[0].confidence); // Should output 'dog'

        });
    }

更改其 current 值的 ref 不会触发 React 组件中的任何重新渲染,但您应该能够替换上面的代码片段并触发重新渲染以查看最新值:

const prediction = useRef<any>(null);

变为:

const [prediction, setPrediction] = useState(null);

getResult 函数将如下所示:

function gotResult() {
    classifier.current.classify(capture, (err: any, result: any) => {
        setPrediction(result[0].label])
    });
}

最终效果图:

return (
    <div>
        <Button variant="contained" color="primary" onClick={() => gotResult()}>Test!</Button>
        <br />
        <span>Prediction: {prediction}</span><br />
    </div>
)

您的 classifier 正在为每个渲染设置 current 值。您可能只希望在 featureExtractorcapturevideoReady 发生变化时使用它。您可以使用 useMemo:

const classifier = useMemo(() => {
    return featureExtractor.classification(capture, videoReady);
}, [featureExtractor, capture, videoReady]);

useMemo 中的依赖数组将确保仅在这些变量发生变化时才定义分类器,而不是在每次渲染时都定义。