具有更多钩子的上下文API

时间:2020-07-01 09:04:06

标签: javascript reactjs jsx context-api

我有一个与API有关的问题,并做出了反应。 我想将API提取分派到ContextAPI组件。 有没有可能放置所有useState挂钩的方法:

    const [tab, setTab] = useState([]); 
    const [search, setSearch] = useState(''); 
    const [query, setQuery] = useState(''); 
    const [select, setSelect] = useState([]);

到单个ContextAPI组件?主要目标是重构代码并将其放入小型组件中。例如表单组件输入组件选择组件

const App = () => {
    const [tab, setTab] = useState([]); 
    const [search, setSearch] = useState(''); 
    const [query, setQuery] = useState(''); 
    const [select, setSelect] = useState([]); 


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


    const getTabulatura = async () => {
        const response = await fetch(`http://www.songsterr.com/a/ra/songs.json?pattern=${query}`);
        const data = await response.json();
        setTab(newData);
    }

    const updateSearch = e => {
        setSearch(e.target.value);
    }

    const getSearch = e => {
        e.preventDefault();
        setQuery(search);
    }

    const tabChange = e => {
        const filteredData = tab.filter(tabItem => tabItem.tabTypes.some(type => type === e.target.value))
        setSelect(filteredData)
    }



    return (
        <div className="App">
            <div className="container">
                <h1 className="header-title">Find the music type of tablature !</h1>
                <form onSubmit={getSearch} className="search-form" >
                    <input className="search-bar" placeholder="Write artist/song" value={search} onChange={updateSearch} />
                    <select className="select-tab" onChange={tabChange} >
                        <option value="none" > --Choose tab-- </option>
                        <option value="chords" > chords </option>
                        <option value="bass" > bass </option>
                        <option value="guitar" > guitar </option>
                        <option value="player" > player </option> </select>
                    <button className="search-button" type='submit' >Search </button>
                </form>
                <div className="tabulatury" > {
                    select.map(tabType => (<Tabulatura
                        title={tabType.title}
                        artist={tabType.artist.name}
                        tabulatura={tabType.tabTypes}
                        key={tabType.id}
                    />
                    ))};
                </div>
            </div>
        </div>
    );
}

export default App

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找Formik表单库? 尝试fromik,这是React JS和React Native的非常流行的表单库。 您可以在Formik的帮助下构建自定义表单组件。

https://formik.org/docs/overview

以下是文档中的几行内容 Formik是一个小型图书馆,可以帮助您解决3个最烦人的部分: 1,获取值进入和脱离表单状态 2.验证和错误消息 3.处理表单提交

通过将以上所有内容集中在一起,Formik可以使事情井井有条,轻松进行测试,重构和推理