当前位置: 首页 > 知识库问答 >
问题:

如何在效果钩子中使用公理?

钱星华
2023-03-14

在基于类的组件中:

componentDidMount() {
    axios.get('https://jsonplaceholder.typicode.com/posts').then((res) => {
        this.setState({
            posts: res.data.slice(0, 10)
        });
        console.log(posts);
    })
}

我试过这个:

const [posts, setPosts] = useState([]);

useEffect(() => {
    axios.get('https://jsonplaceholder.typicode.com/posts').then((res) => {
        setPosts(res.data.slice(0, 10));
        console.log(posts);
    })
});

它创建了一个无限循环。如果我传递一个[]/{}作为第二个参数[1][2],那么它将阻止进一步的调用。但它也会阻止数组更新。

[1] 无限循环效应

[2] 如何只调用一次带有React useEffect的加载函数

共有3个答案

束帅
2023-03-14

我已经为Axios编写了一个自定义挂钩。js。

下面是一个例子:

import React, { useState } from 'react';

import useAxios from '@use-hooks/axios';

export default function App() {
  const [gender, setGender] = useState('');
  const {
    response,
    loading,
    error,
    query,
  } = useAxios({
    url: `https://randomuser.me/api/${gender === 'unknow' ? 'unknow' : ''}`,
    method: 'GET',
    options: {
      params: { gender },
    },
    trigger: gender,
    filter: () => !!gender,
  });

  const { data } = response || {};

  const options = [
    { gender: 'female', title: 'Female' },
    { gender: 'male', title: 'Male' },
    { gender: 'unknow', title: 'Unknow' },
  ];

  if (loading) return 'loading...';
  return (
    <div>
      <h2>DEMO of <span style={{ color: '#F44336' }}>@use-hooks/axios</span></h2>
      {options.map(item => (
        <div key={item.gender}>
          <input
            type="radio"
            id={item.gender}
            value={item.gender}
            checked={gender === item.gender}
            onChange={e => setGender(e.target.value)}
          />
          {item.title}
        </div>
      ))}
      <button type="button" onClick={query}>Refresh</button>
      <div>
        {error ? error.message || 'error' : (
          <textarea cols="100" rows="30" defaultValue={JSON.stringify(data || {}, '', 2)} />
        )}
      </div>
    </div>
  );
}

你可以在网上看到结果。

慎懿轩
2023-03-14

您可以检查axios钩子是如何实现的。

它非常简单,使用您提供的配置对象(或url)来决定何时发出请求,何时不发出请求,正如Thole在回答中所解释的那样。

除了允许您在无状态功能组件中使用令人敬畏的axios之外,它还支持服务器端渲染,事实证明,钩子非常容易实现。

免责声明:我是该软件包的作者。

华永逸
2023-03-14

useffect提供一个空数组作为第二个参数,以指示在初始渲染后只希望效果运行一次,这是一种方法。控制台的原因。日志(员额)向您显示空数组是因为posts变量仍然引用初始数组,setPosts也是异步的,但是如果在渲染中使用,它仍然可以正常工作。

实例

const { useState, useEffect } = React;

function App() {
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    setTimeout(() => {
      setPosts([{ id: 0, content: "foo" }, { id: 1, content: "bar" }]);
      console.log(posts);
    }, 1000);
  }, []);

  return (
    <div>{posts.map(post => <div key={post.id}>{post.content}</div>)}</div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.production.min.js"></script>

<div id="root"></div>
 类似资料:
  • 在React的官方文件中提到- 如果您熟悉React类生命周期方法,那么可以将useEffect钩子看作componentDidMount、componentDidUpdate和componentWillUnmount的组合。 我的问题是--我们如何在钩子中使用生命周期方法?

  • 我使用的是commercehub oss/gradle cucumber jvm插件。希望实现自动设置和拆卸的挂钩。就像在junit RunCuketTests中,@BeforeClass和@AfterClass 如何在此插件的自动化中实现这些? https://github.com/commercehub-oss/gradle-cucumber-jvm-plugin

  • 假设我有一个依赖于其他状态的状态(例如,当A改变时,我希望B改变)。 在useEffect钩子中创建一个观察a并设置B的钩子是否合适? 效果是否会层叠,当我单击按钮时,第一个效果会激发,导致b发生变化,导致第二个效果激发,然后再进行下一次渲染?这样构造代码有没有性能方面的缺点?

  • 我试图在react with typescript中创建一个登录表单。但setEmail方法不接受该值。它表示“string”类型的参数不能分配给“SetStateAction”类型的参数。我该怎么解决它?

  • 2-我在FlatList中实现分页,所以当用户到达数据列表的末尾时,我调用一个函数来增加当前页,并根据当前页更新的情况,再次提取,因为我将to useEffect传递给依赖项数组 所以这里的问题是应该将以前的数据与新数据联系起来,所以我使用方法, 它工作得很好,但有时我收到一个警告,告诉我有一个重复的数据,当我使用扩展时不工作,我得到一个很大的错误,因为Flatlist keyExtractor问

  • 本文向大家介绍在React.js中使用useState钩子,包括了在React.js中使用useState钩子的使用技巧和注意事项,需要的朋友参考一下 钩子允许功能组件在反应中获得基于类的组件中可用的特性,从而使它们更加强大。 useState,我们将从react导入。从'react'导入{useState}; 这有助于我们为功能组件创建局部状态变量,并提供更新该变量的方法。 类中的状态是一个对象