【问题标题】:Switch to results Component `onSubmit` a search form in react hooks using react router使用反应路由器切换到结果组件“onSubmit”在反应钩子中的搜索表单
【发布时间】:2020-07-08 10:09:19
【问题描述】:

您好,我有一个场景,我在顶部导航中放置了一个搜索栏,以便用户可以从应用程序的任何位置进行搜索。用户提交搜索表单后,如何切换到结果组件?这是我的搜索组件,它使用搜索结果填充全局状态,但我无法将视图切换到结果组件。

import React, { useState, useEffect, useContext } from 'react';
import axios from 'axios';
import { StateContext } from '../../StateContext';

import './SearchBar.scss';

import sprite from '../../assets/icons/sprite.svg';

function SearchBar() {
    const [state, setState] = useContext(StateContext);
    const [userInput, setUserInput] = useState('');
    const [bookName, setBookName] = useState('');

    useEffect(() => {
        axios
            .get(`https://www.googleapis.com/books/v1/volumes?q=${bookName}`)
            .then((res) => {
                let book_list = res.data.items;
                setState({
                    book_list: book_list,
                    heading: 'Search Results'
                });
            })
            .catch((err) => console.log(err));
    }, [bookName]);

    const findBook = (e) => {
        e.preventDefault();
        setBookName(userInput);
    };

    const onChange = (e) => {
        setUserInput(e.target.value);
    };
    return (
        <form className='searchbar' onSubmit={findBook}>
            <input
                type='search'
                className='searchbar__input'
                placeholder='Search for a book'
                value={userInput}
                onChange={onChange}
            />
            <button className='searchbar__button'>
                <svg className='searchbar__icon'>
                    <use xlinkHref={`${sprite}#icon-search`} />
                </svg>
            </button>
        </form>
    );
}

export default SearchBar;

这是我处理路由的方式:

import React from 'react';

import Nav from './components/Nav/Nav';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Books from './containers/Books';

import Book from './containers/Book';

import { ContextController } from './StateContext';

function App() {
    return (
        <ContextController>
            <Router>
                <div className='app'>
                    <Nav />
                    <main>
                        <Switch>
                            <Route exact path='/' component={Books} />
                            <Route exact path='/book/:id' component={Book} />
                        </Switch>
                    </main>
                </div>
            </Router>
        </ContextController>
    );
}

export default App;

【问题讨论】:

    标签: reactjs react-router react-hooks react-router-dom


    【解决方案1】:

    如果您有专门的搜索结果路径,请在您的 ContextController 中尝试此操作

    import { useHistory } from 'react-router-dom';
    
    // later
    
    const history = useHistory();
    
    React.useEffect(() => {
      if (state?.book_list?.length > 0) {
        history.push('/search-results');
      }
    }, [state]);
    

    另外,重要的是要注意Router 应该在您的Data Context 之上; 因为如果要从 a 树中访问历史记录,则需要将其包裹在 Router 中,否则它将返回 undefined 作为 history 的值

    这是working codesandbox

    【讨论】:

    • TypeError: history.push is not a function
    • 你用的是什么版本的 react router dom?
    • 版本^5.1.2
    • 我发现了你的问题,你需要在ContextProvider之前移动路由器
    • 成功了,大家欢呼。问题是用Router 包装DataProvider
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2020-01-26
    • 2021-04-22
    • 2019-09-15
    • 2022-01-15
    • 2019-11-18
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多