laravel React没有按我的预期设置状态

p1iqtdky  于 2023-02-17  发布在  React
关注(0)|答案(1)|浏览(130)

我有两段代码,React中的前端和Laravel中的后端,问题是我调用API来获取SQL连接的数组,但在useEffect React Hook中,它没有获取信息,但如果我创建一个按钮来使其工作,我不知道为什么useEffect Hook不能正常工作
我有一段代码

拉腊维尔:

public function show($id)
    {
        $returned = response('El lote solicitado no existe', Response::HTTP_BAD_REQUEST);

        $lote = DB::table('lotes')
        ->leftjoin('articulos', 'lotes.idArticulo', '=', 'articulos.id')
        ->select('lotes.idLote', 'lotes.idArticulo', 'lotes.cantidad', 'lotes.consumoPreferente', 'lotes.observaciones', 'articulos.descripcion')
        ->where('lotes.id', $id)
        ->get();

        if($lote){
            $returned = response($lote, Response::HTTP_OK);
        }

        return $returned;
    }

React:

const [lote, setLote] = useState([])

    useEffect(() => {
        document.title = `Lote ${id}`
        getLote()
    }, [])

    const { id } = useParams()

    const getLote = async () => {
        try {
            const response = await axios.get(`${endpoint}/lote/${id}`)
            setLote(response.data)
        } catch (e) {
            console.log(`Error ${e}`)
        }

    }

问题是lote没有在useEffect钩子中设置,但是如果我在它的外部调用getLote函数,它会工作。
另一个问题是,如果我将laravel部分更改为这一部分,则可以在useEffect调用中正常工作:

我认为关键就在这里,如果我使用“findOrFail”,它会正常工作,但如果进行SQL查询,它不会,但如果我使用async - await,它应该等待,对吗?

$lote = Lote::findOrFail($id);
        if($lote ){
            $returned = response($lote , Response::HTTP_OK);
        }

        return $returned;

还要提到我使用axios来打电话,这也是问题所在吗?
你知道会发生什么吗?

ffx8fchx

ffx8fchx1#

首先要做的是确保id已经在useEffect中定义好了,所以需要像这样重写useEffect

useEffect(() => {
  if(!id) {
    return;
  }
  document.title = `Lote ${id}`
  getLote()
}, [id]);

另外,我建议将函数放在useCallback

const getLote = useCallback(async () => {
        try {
            const response = await axios.get(`${endpoint}/lote/${id}`)
            setLote(response.data)
        } catch (e) {
            console.log(`Error ${e}`)
        }

    }, [id]);

在deps阵列中添加相关依赖项至关重要。

相关问题