亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 React 類重構為 hooks - 實體更新組件

將 React 類重構為 hooks - 實體更新組件

慕神8447489 2023-01-06 10:53:34
我有這個用于更新業務實體的 React 組件。它基本上通過 componentDidMount 上的 ID 獲取,并在提交表單時發送放置請求。我想將其重構為基于鉤子的組件。這是之前的代碼import React from "react";import axios from "axios";//Api Helper Methodsconst API_HOST = "https://api.example.com";const get = (endPoint) =>  axios    .get(`${API_HOST}/${endPoint}`)    .then((response) => response.data);export const put = (endPoint, payload, id) =>  axios    .put(`${API_HOST}/${endPoint}/${id}`, payload)    .then((response) => response.data);//React route (uses React Router)const END_POINT = `users`;class Entity extends React.Component {  state = { entity: {}, fetching: true };  getEntity = async () => {    const { id } = this.props.match.params;    this.setState({ fetching: true });    const entity = await get(`${END_POINT}/${id}`);    this.setState({ entity, fetching: false });  };  onChange = (key, value) =>    this.setState({ entity: { ...this.state.entity, [key]: value } });  componentDidMount() {    this.getEntity();  }  onSubmit = async (e) => {    e.preventDefault();    let { entity } = this.state;    let { match } = this.props;    await put(END_POINT, entity, match.params.id);  };  render() {    const { entity, fetching } = this.state;    if (fetching) {      return <p>loading...</p>;    }    return (      <form onSubmit={this.onSubmit}>        <label htmlFor="name">name</label>        <input          value={entity["name"]}          onChange={(e) => this.onChange("name", e.target.value)}        />        <button type="submit">submit</button>      </form>    );  }}export default Entity;這是我到目前為止的代碼。下一步是提取自定義掛鉤。const END_POINT = `users`;export default function Entity({ match }) {  const [entity, setEntity] = useState({ name: "" });  const [fetching, setFetching] = useState( true );  const { id } = match.params;  const onChange = (key, value) => setEntity({ ...entity, [key]: value });
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

我沒有對此進行測試,但這應該接近您想要的實體函數自定義掛鉤。


import React, { useEffect, useState } from 'react';


const API_HOST = "https://api.example.com";

const END_POINT = `users`;


function useEntity(entityID) {

    const [entity, setEntity] = useState({})

    

    

    useEffect(() => {

        (async () => {

            await fetch(`${API_HOST}/${END_POINT}/${props.match.params}`)

                .then(async res => await res.json())

                .then(result => setEntity(result));

        })();

    }, [])


    return entity

}


export default function Entity(props) {

    const { id } = props.match;

    const entity = useEntity(id);

    const onSubmit = async () => await fetch(`${API_HOST}/${END_POINT}/${id}`, {method: 'PUT', body: entity})


    if (!entity) {

        return <p>loading...</p>;

    }


    return (

        <form onSubmit={onSubmit}>

            <label htmlFor="name">name</label>

            <input

            value={entity["name"]}

            onChange={(e) => setEntity({ ...entity, name: e.target.value})}

            />

            <button type="submit">submit</button>

        </form>

    )

}



查看完整回答
反對 回復 2023-01-06
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

我讓它像這樣工作。


import React, {useEffect, useState} from "react";

import axios from "axios";


//Api Helper Methods

const API_HOST = "https://api.example.com";


const get = (endPoint) =>

  axios.get(`${API_HOST}/${endPoint}`).then((response) => response.data);


export const put = (endPoint, payload, id) =>

  axios

    .put(`${API_HOST}/${endPoint}/${id}`, payload)

    .then((response) => response.data);



const END_POINT = `users`;


const useEntity = (entityId) => {

  const [entity, setEntity] = useState({ name: "" });

  const [fetching, setFetching] = useState(true);


  useEffect(() => {

      (async () => {

        const entity = await get(`${END_POINT}/${entityId}`);

        setEntity(entity);

        setFetching(false);

    })();

  }, [entityId]);


  return [entity, fetching, setEntity];

};


//React route (uses React Router)

export default function Entity({ match }) {

  const { id } = match.params;

  const [entity, fetching, setEntity] = useEntity(id);


  const onChange = (key, value) => setEntity({ ...entity, [key]: value });


  const onSubmit = async (e) => {

    e.preventDefault();

    await put(END_POINT, entity, id);

  };


  if (fetching) {

    return <p>loading...</p>;

  }


  return (

    <form onSubmit={onSubmit}>

      <label htmlFor="name">name</label>

      <input

        value={entity["name"]}

        onChange={(e) => onChange("name", e.target.value)}

      />

      <button type="submit">submit</button>

    </form>

  );

}



查看完整回答
反對 回復 2023-01-06
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號