简体   繁体   English

在 useEffect 中运行 useReadCypher

[英]Run useReadCypher inside useEffect

I'm writing React functional component that should be input for search on Neo4j.我正在编写 React 功能组件,应该输入以在 Neo4j 上进行搜索。

I'm dependant on the useReadCypher and cannot change it's inner implementation.我依赖于 useReadCypher 并且无法更改它的内部实现。

I cannot write the useReadCypher inside the useEffect because it's break the rule of hooks.我不能在 useEffect 中编写 useReadCypher,因为它违反了钩子规则。

import React, { useState, useEffect, useCallback } from 'react';
import { useReadCypher } from "use-neo4j";

export default function Search() {
const [count, setCount\] = useState(0);
const [runQuery, setRunQuery\] =     useState(false);
const query = `MATCH (n) RETURN n LIMIT ${count}`;
const data = useReadCypher(query);

const handleClick = useCallback(() => {
    setCount(count + 1);
    setRunQuery(true);
}, [count]);

useEffect(() => {
    if (runQuery) {
        console.log('Data changed', data);
        setRunQuery(false);
    }
}, [data, runQuery]);

return (
    <div>
        <p>You clicked {count} times</p>
        <button onClick={handleClick}>
            Click me
        </button>
        {JSON.stringify(data)}
    </div>
);

}

I want to be able to click on the button to rerun the query using the useReadCypher.我希望能够单击按钮以使用 useReadCypher 重新运行查询。

What should be the approach to solving this issue?解决这个问题的方法应该是什么?

Thank you.谢谢。

It was the solution.这是解决方案。 Here is my final component.这是我的最后一个组成部分。

import React, { useState, useEffect, useCallback } from 'react';
import { useReadCypher } from "use-neo4j";
import {Header} from "semantic-ui-react";
import {StyledDiv, StyledInput} from "./Style";

export default function Search() {
    const [term, setTerm] = useState('');
    const [runQuery, setRunQuery] = useState(false);
    const query = `MATCH (n) RETURN n LIMIT ${term}`;
    const {records, run} = useReadCypher(query);

    const handleClick = useCallback(() => {
        setRunQuery(true);
        run();
    }, [term]);

    useEffect(() => {
        if (runQuery) {
            console.log('Data changed', records);
            setRunQuery(false);
        }
    }, [records, runQuery]);

    return (
        <>
            <Header as='H2' color='blue' textAlign='center' block>Search</Header>
            <StyledDiv>
                <StyledInput
                    value={term}
                    onChange={(e: any) => setTerm(e.target.value)}
                />
                <button onClick={handleClick}>Search</button>
            </StyledDiv>
            <div>
                {JSON.stringify(records)}
            </div>
        </>
    );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM