【问题标题】:How to change a snippets of code from Class Component to Functional Component如何将代码片段从类组件更改为功能组件
【发布时间】:2021-11-13 19:38:26
【问题描述】:

这里是sn-p的代码,我想改成Functional组件,我的代码差不多写到这里了,请查收。

import _ from 'lodash';
import { ListItem, SearchBar, Avatar } from 'react-native-elements';
import { getUsers, contains } from './api/index';

function App(props) {

  const [loading, setLoading] = useState(false);   
  const [data, setData] = useState([]);
  const [error, setError] = useState(null);
  const [fullData, setFullData] = useState([]);
  const [query, setQuery] = useState();

  useEffect(() => {
    makeRemoteRequest();
  },[query]);

  const makeRemoteRequest = _.debounce(() => {
    setLoading(true);
    getUsers(20, query)
      .then((users) => {
        setLoading(false);
        setData(users);
        setFullData(users);
      })
      .catch((error) => {
        setLoading(false);
      });
  }, 250);

  const handleSearch = (text) => {
    const formattedQuery = text.toLowerCase();
    const data = _.filter(fullData, (user) => {
      return contains(user, formattedQuery);
    });
   // I want to change the below code to work on Functioanl component
    //  this.setState({ data, query: text }, () => //this.makeRemoteRequest());
   // New code here.....
          };

我以不同的方式实现它,但不起作用。

【问题讨论】:

  • 你打算用data做什么?
  • 搜索数据,在 setState 添加数据并通过文本分配查询,在每个用户输入时我都会检查字符。
  • 如果它是一个 api 调用,那么你可能想使用 useEffect Hook
  • @SachinYadav 我已经调用了 API 并设置了数据,现在正在尝试处理搜索。
  • 你在哪里进行 api 调用很重要,你需要在 useEffect() 钩子中调用 makeRemoteRequest()

标签: javascript reactjs react-native react-hooks


【解决方案1】:

你可以有类似下面的东西。

const [query, setQuery] = useState();
const [data, setData] = useState();

useEffect(() => {
  makeRemoteRequest();
}, [query])

阅读更多关于useEffecthere

【讨论】:

    【解决方案2】:

    您正在尝试制作一组​​数据和文本,然后在设置后调用回调。

    有几种方法可以获得这种行为。

    我建议你有一个包含数据和文本的状态(useState),然后通过useEffect 监听这个阶段的变化。

    export default function App() {
      const [request, setRequest] = useState({data: {}, text: ''});
      const makeRemoteRequest = useCallback(() => console.log({request}),[request]);
      
      useEffect(() => {
        //on mount 
        setRequest({data: {obj:'with data'}, text: 'text'})
      },[])
    
      useEffect(() => {
        makeRemoteRequest()
      },[request,makeRemoteRequest])
      
      return (
        <div className="App">
          <h1>Hello CodeSandbox</h1>
          <h2>Start editing to see some magic happen!</h2>
        </div>
      );
    }
    

    你可以在这里看到,它是一个功能组件:

    • 设置挂载状态(阅读评论)
    • 每次状态request通过useCallback钩子改变时定义一个函数makeRemoteRequest
    • 每次状态request或回调makeRemoteRequest通过useEffect挂钩发生变化时调用函数makeRemoteRequest

    编辑:

    import _ from 'lodash';
    import { ListItem, SearchBar, Avatar } from 'react-native-elements';
    import { getUsers, contains } from './api/index';
    
    function App(props) {
    
      const [loading, setLoading] = useState(false);   
      const [data, setData] = useState([]);
      const [error, setError] = useState(null);
      const [fullData, setFullData] = useState([]);
      const [query, setQuery] = useState();
    
      useEffect(() => {
        makeRemoteRequest();
      },[query]);
    
      const makeRemoteRequest = _.debounce(() => {
        setLoading(true);
        getUsers(20, query)
          .then((users) => {
            setLoading(false);
            setData(users);
            setFullData(users);
          })
          .catch((error) => {
            setLoading(false);
          });
      }, 250);
    
      const handleSearch = (text) => {
        const formattedQuery = text.toLowerCase();
        const data = _.filter(fullData, (user) => {
          return contains(user, formattedQuery);
        });
        setData(data);
        setQuery(text);
      }
    };
    

    其实你想要的是触发函数makeRemoteRequest,现在你要做的是做正确的设置(这意味着setQuery),这将触发useEffect

    【讨论】:

    • 请检查,我更新了我的问题并添加了我的代码 sn-ps。
    • 请检查我的代码,在评论中我在这里说的是新代码。尝试为我更改上面的代码。
    • 它正在工作,但是当用户在搜索栏中键入时,每次它都不会重新呈现。但在第二次尝试重新渲染之后。
    • @SamimHakimi 小心你在依赖数组中放了什么,也许其中一个缺少一些东西it.reactjs.org/docs/…
    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 2021-09-16
    • 2021-03-24
    • 2022-11-30
    • 1970-01-01
    • 2020-06-22
    • 2018-06-08
    • 2020-12-21
    相关资源
    最近更新 更多