Javascript 将基于类的组件转换为基于函数的组件

Javascript 将基于类的组件转换为基于函数的组件,javascript,node.js,reactjs,react-hooks,Javascript,Node.js,Reactjs,React Hooks,在这里,我正在研究react的自动完成和自动填充 我试图将其转换为react钩子,因为我编写的所有代码都只包含在钩子中 根据我的理解,我已经在某种程度上将它转换为基于钩子的。但我不能完全转换它 原始代码 import React,{Component}来自“React”; 类应用程序扩展组件{ 建造师(道具){ 超级(道具); 此.state={ 项目:{ 代码:“, 姓名:“, 单位:“, 比率:“ }, 光标:0, 搜索项目:[] }; this.autocomplete=this.auto

在这里,我正在研究react的自动完成和自动填充

我试图将其转换为react钩子,因为我编写的所有代码都只包含在钩子中

根据我的理解,我已经在某种程度上将它转换为基于钩子的。但我不能完全转换它

原始代码
import React,{Component}来自“React”;
类应用程序扩展组件{
建造师(道具){
超级(道具);
此.state={
项目:{
代码:“,
姓名:“,
单位:“,
比率:“
},
光标:0,
搜索项目:[]
};
this.autocomplete=this.autocomplete.bind(this);
this.handleKeyup=this.handleKeyup.bind(this);
this.handleKeydown=this.handleKeydown.bind(this);
this.handleListKeydown=this.handleListKeydown.bind(this);
this.selectItem=this.selectItem.bind(this);
this.handleChange=this.handleChange.bind(this);
}
自动完成(evt){
让text=evt.target.value;
取回(`https://invoiceitems.herokuapp.com/items?name_like=${text}&_limit=6`)
.然后((res)=>res.json())
。然后((数据)=>{
this.setState({searchItems:data});
});
}
handleKeyup(evt){
如果(evt.keyCode===27){
this.setState({searchItems:[]});
返回false;
}
}
handleKeydown(evt){
const{cursor,searchItems}=this.state;
//向上/向下箭头按钮应选择下一个/上一个列表元素
如果(evt.keyCode===38&&cursor>0){
this.setState((prevState)=>({
游标:prevState.cursor-1
}));
}else if(evt.keyCode==40&&cursor({
游标:prevState.cursor+1
}));
}
如果(evt.keyCode===13){
让currentItem=searchItems[光标];
如果(currentItem!==未定义){
常量{name,code,rate,unit}=currentItem;
this.setState({item:{name,code,rate,unit},searchItems:[]});
}
}
如果(evt.keyCode===8){
this.setState({item:{name:,code:,rate:,unit:}});
}
}
选择项目(id){
const{searchItems}=this.state;
让selectedItem=searchItems.find((item)=>item.code==id);
常量{code,name,unit,rate}=selectedItem;
this.setState({item:{code,name,unit,rate}});
this.setState({searchItems:[]});
}
handleListKeydown(evt){
console.log(evt.keyCode);
}
手柄更换(evt){
this.setState({item:{[evt.target.name]:evt.target.value}});
}
render(){
const{searchItems,cursor,item,handleChange}=this.state;
常量{代码、名称、单位、费率}=项目;
返回(
自动完成示例
项目名称
{searchItems.length>0&&(
    {searchItems.map((item,idx)=>(
  • this.selectItem(item.code)} onKeyDown={(evt)=>this.handleListKeydown(evt,item.code)} > {item.name}
  • ))}
)} ); } } 导出默认应用程序;
链接到原始代码:

使用挂钩 下面是我试图转换为钩子的代码

import React, { useState } from "react";

export default function FunctionName(props) {
  const [item, setItem] = useState({
    vendorNameData: invoiceDetail[0].invoiceData.vendor,
    vendorAccountData: invoiceDetail[0].invoiceData.vendaAccount,
    vendorAddressData: invoiceDetail[0].invoiceData.vendorAddress
  });
  const [cursor, setCursor] = useState(0);
  const [searchItems, SetSearchItems] = useState([]);

  function AutoComplete(evt) {
    let text = evt.target.value;
    console.log(text);
    fetch(`https://invoiceitems.herokuapp.com/items?name_like=${text}&_limit=6`)
      .then((res) => res.json())
      .then((data) => {
        SetSearchItems(data);
      });
  }

  function HandleKeyUp(evt) {
    if (evt.keyCode === 27) {
      SetSearchItems([]);
      return false;
    }
  }

  function HandleKeyDown(evt) {
    // const [cursor, setCursor] = useState();
    // const [searchItems, SetSearchItems] = useState()

    if (evt.keyCode === 38 && cursor > 0) {
      setCursor((cursor) => ({ cursor: cursor + 1 }));
    } else if (evt.keyCode === 40 && cursor < searchItems.length - 1) {
      setCursor((cursor) => ({ cursor: cursor + 1 }));
    }
    if (evt.keyCode === 13) {
      let currentItem = searchItems[cursor];
      if (currentItem !== undefined) {
        const {
          vendorNameData,
          vendorAccountData,
          vendorAddressData
        } = currentItem;
        setItem({ vendorNameData, vendorAccountData, vendorAddressData });
        SetSearchItems([]);
      }
    }
    if (evt.keyCode === 8) {
      setItem({
        vendorNameData: "",
        vendorAccountData: "",
        vendorAddressData: ""
      });
    }
  }

  function SelectItem(id) {
    const [searchItems, SetSearchItems] = useState();
    let selectedItem = searchItems.find((item) => item.code === id);
    const {
      vendorNameData,
      vendorAccountData,
      vendorAddressData
    } = selectedItem;
    setItem({ vendorNameData, vendorAccountData, vendorAddressData });
    SetSearchItems([]);
  }

  function HandleListKeyDown(evt) {
    console.log(evt.keyCode);
  }

  function HandleChange(evt) {
    setItem({ item: { [evt.target.name]: evt.target.value } });
  }
}
import React,{useState}来自“React”;
导出默认函数FunctionName(道具){
const[item,setItem]=useState({
vendorNameData:invoiceDetail[0]。invoiceData.vendor,
vendorAccountData:invoiceDetail[0]。invoiceData.vendaAccount,
vendorAddressData:invoiceDetail[0]。invoiceData.vendorAddress
});
const[cursor,setCursor]=useState(0);
const[searchItems,SetSearchItems]=useState([]);
函数自动完成(evt){
让text=evt.target.value;
console.log(文本);
取回(`https://invoiceitems.herokuapp.com/items?name_like=${text}&_limit=6`)
.然后((res)=>res.json())
。然后((数据)=>{
设置搜索系统(数据);
});
}
功能HandleKeyUp(evt){
如果(evt.keyCode===27){
集耳结构([]);
返回false;
}
}
功能HandleKeyDown(evt){
//const[cursor,setCursor]=useState();
//常量[searchItems,SetSearchItems]=useState()
如果(evt.keyCode===38&&cursor>0){
setCursor((cursor)=>({cursor:cursor+1}));
}else if(evt.keyCode==40&&cursor({cursor:cursor+1}));
}
如果(evt.keyCode===13){
让currentItem=searchItems[光标];
如果(currentItem!==未定义){
常数{
vendorNameData,
供应商会计数据,
供应商地址数据
}=当前项目;
setItem({vendorNameData,vendorAccountData,vendorAddressData});
集耳结构([]);
}
}
如果(evt.keyCode===8){
设定项({
vendorNameData:“”,
供应商帐户数据:“”,
供应商地址数据:“
});
}
}
功能选择项(id){
const[searchItems,SetSearchItems]=useState();
让selectedItem=searchItems.find((item)=>item.code==id);
常数{
vendorNameData,
供应商会计数据,
供应商地址数据
}=selectedItem;
setItem({vendorNameData,vendorAccountData,vendorAddressData});
集耳结构([]);
}
功能HandleListKeyDown(evt){
console.log(evt.keyCode);
}
功能手柄更改(evt){
setItem({item:{[evt.target.name]:evt.target.value}});
}
}
指出我落后的地方真的很有帮助。我已经尽力了,但这是我能想到的


任何帮助都将不胜感激。

我已经“复制”并清理了您的原始文档
import React, { useState } from "react";

export default function FunctionName(props) {
  const [item, setItem] = useState({
    vendorNameData: invoiceDetail[0].invoiceData.vendor,
    vendorAccountData: invoiceDetail[0].invoiceData.vendaAccount,
    vendorAddressData: invoiceDetail[0].invoiceData.vendorAddress
  });
  const [cursor, setCursor] = useState(0);
  const [searchItems, SetSearchItems] = useState([]);

  function AutoComplete(evt) {
    let text = evt.target.value;
    console.log(text);
    fetch(`https://invoiceitems.herokuapp.com/items?name_like=${text}&_limit=6`)
      .then((res) => res.json())
      .then((data) => {
        SetSearchItems(data);
      });
  }

  function HandleKeyUp(evt) {
    if (evt.keyCode === 27) {
      SetSearchItems([]);
      return false;
    }
  }

  function HandleKeyDown(evt) {
    // const [cursor, setCursor] = useState();
    // const [searchItems, SetSearchItems] = useState()

    if (evt.keyCode === 38 && cursor > 0) {
      setCursor((cursor) => ({ cursor: cursor + 1 }));
    } else if (evt.keyCode === 40 && cursor < searchItems.length - 1) {
      setCursor((cursor) => ({ cursor: cursor + 1 }));
    }
    if (evt.keyCode === 13) {
      let currentItem = searchItems[cursor];
      if (currentItem !== undefined) {
        const {
          vendorNameData,
          vendorAccountData,
          vendorAddressData
        } = currentItem;
        setItem({ vendorNameData, vendorAccountData, vendorAddressData });
        SetSearchItems([]);
      }
    }
    if (evt.keyCode === 8) {
      setItem({
        vendorNameData: "",
        vendorAccountData: "",
        vendorAddressData: ""
      });
    }
  }

  function SelectItem(id) {
    const [searchItems, SetSearchItems] = useState();
    let selectedItem = searchItems.find((item) => item.code === id);
    const {
      vendorNameData,
      vendorAccountData,
      vendorAddressData
    } = selectedItem;
    setItem({ vendorNameData, vendorAccountData, vendorAddressData });
    SetSearchItems([]);
  }

  function HandleListKeyDown(evt) {
    console.log(evt.keyCode);
  }

  function HandleChange(evt) {
    setItem({ item: { [evt.target.name]: evt.target.value } });
  }
}
import React, {useState, useCallback} from 'react';

function Input() {
    const [item, setItem] = useState({
        code: '',
        name: '',
        unit: '',
        rate: ''
    });

    const [cursor, setCursor] = useState(0);

    const [searchItems, setSearchItems] = useState([]);

    const autocomplete = useCallback((evt) => {
        const text = evt.target.value;
        fetch(
            `https://invoiceitems.herokuapp.com/items?name_like=${text}&_limit=6`
        )
            .then((res) => res.json())
            .then((data) => {
                setSearchItems(data);
            });
    }, []);

    const handleKeyup = useCallback((evt) => {
        if (evt.keyCode === 27) {
            setSearchItems([]);
            return false;
        }
        return true;
    }, []);

    const handleKeydown = useCallback(
        (evt) => {
            // arrow up/down button should select next/previous list element
            if (evt.keyCode === 38 && cursor > 0) {
                setCursor((prevCursor) => prevCursor - 1);
            } else if (evt.keyCode === 40 && cursor < searchItems.length - 1) {
                setCursor((prevCursor) => prevCursor + 1);
            }

            if (evt.keyCode === 13) {
                let currentItem = searchItems[cursor];
                if (currentItem !== undefined) {
                    const {code, name, unit, rate} = currentItem;
                    setItem({code, name, unit, rate});
                    setSearchItems([]);
                }
            }

            if (evt.keyCode === 8) {
                setItem({code: '', name: '', unit: '', rate: ''});
            }
        },
        [cursor, searchItems]
    );

    const selectItem = useCallback(
        (id) => {
            let selectedItem = searchItems.find((item) => item.code === id);
            const {code, name, unit, rate} = selectedItem;
            setItem({code, name, unit, rate});
            setSearchItems([]);
        },
        [searchItems]
    );

    const handleListKeydown = useCallback((evt) => {
        console.log(evt.keyCode);
    }, []);

    return (
        <div className={'container mt-3'}>
            <h1 className={'h2 text-center'}>{'Autocomplete Example'}</h1>
            <div className={'form-group'}>
                <label htmlFor={'autocomplete'}>{'Item Name'}</label>
                <input
                    type={'text'}
                    id={'autocomplete'}
                    onChange={autocomplete}
                    onKeyUp={handleKeyup}
                    onKeyDown={handleKeydown}
                    value={item.name}
                    className={'custom-input form-control'}
                />
                {searchItems.length > 0 && (
                    <ul className={'list-group'}>
                        {searchItems.map((item, idx) => (
                            <li
                                className={
                                    cursor === idx
                                        ? 'active list-group-item'
                                        : 'list-group-item'
                                }
                                key={idx}
                                onClick={() => selectItem(item.code)}
                                onKeyDown={handleListKeydown}>
                                {item.name}
                            </li>
                        ))}
                    </ul>
                )}
            </div>
        </div>
    );
}

export {Input};