Компонент, возвращающий неопределенный

#javascript #reactjs #react-hooks

Вопрос:

Я работаю с двумя файлами App.js который отображает компоненты и Search.js который содержит компонент строки поиска. В App.js похоже на:

 import React, { useState } from 'react';
import './App.css';
import Greeting from '../Greeting/Greeting';
import InputWithLabel from '../Search/Search';
import List from '../List/List';

// App component
const App = () => {
  return (
    <div className="App">
      <InputWithLabel
        id="search"
        value={searchTerm}
        isFocused
        onInputChange={handleSearch}
      >
        <strong>Search:</strong>
      </InputWithLabel>
      <hr />
      <List list={searchedStories} />
    </div>
  );
}

export default App;
 

В Search.js компонент выглядит так:

 import React, { useState } from 'react';

// Search bar, destructure props search, onSearch
function InputWithLabel({ id, value, type = "text", onInputChange, isFocused, children, }) {
    const stories = [
        {
            title: 'React',
            url: 'https://reactjs.org/',
            author: 'Jordan Walke',
            num_comments: 3,
            points: 4,
            objectID: 0,
        },
        {
            title: 'Redux',
            url: 'https://redux.js.org/',
            author: 'Dan Abramov, Andrew Clark',
            num_comments: 2,
            points: 5,
            objectID: 1,
        },
    ];

    const useSemiPersistentState = (key, initialState) => {
        const [value, setValue] = React.useState(
            localStorage.getItem(key) || initialState
        );

        React.useEffect(() => {
            localStorage.setItem(key, value);
        }, [value, key]);

        return [value, setValue]
    };

    // Set state on searchTerm, setSearchTerm with custom hook
    const [searchTerm, setSearchTerm] = useSemiPersistentState(
        'search',
        'React'
    );

    // Get the value of search input
    const handleSearch = (event) => {
        setSearchTerm(event.target.value);
    };

    // Check if user input matches stories array
    // toLowerCase() both values
    const searchedStories = stories.filter((story) => story.title.toLowerCase().includes(searchTerm.toLowerCase())
    );

    const inputRef = React.useRef();

    React.useEffect(() => {
        if (isFocused amp;amp; inputRef.current) {
            inputRef.current.focus();
        }
    }, [isFocused]);

    return (
        <>
            <label htmlFor={id}>{children}</label>
            amp;nbsp;
            <input
                ref={inputRef}
                id={id}
                type={type}
                value={value}
                autoFocus={isFocused}
                onChange={onInputChange}
            />
        </>
    )
}

export default InputWithLabel;
 

Ошибки, которые я получаю, являются:
Не удалось скомпилировать
src/Components/App/App.js
Строка 62:16: «Поисковый запрос» не определен нет-
не определен Строка 64:24: «Поиск по запросу» не определен нет-
не определен Строка 69:19: «Истории поиска» не определены нет-не определен

Найдите ключевые слова, чтобы узнать больше о каждой ошибке.

Я, должно быть, передаю {Поисковый запрос}, {поисковые запросы}, {Истории поиска} неверно, но не знаю, насколько это неправильно?

Комментарии:

1. Компонент вашего приложения не передается searchTerm в реквизитах

Ответ №1:

onChange={onInputChange} должно быть onChange={handleSearch} , и вы можете удалить реквизиты для вашего компонента

   <InputWithLabel
        id="search"        
        isFocused   
      >
 

так как вы ими не пользуетесь.
Ваш app компонент должен нести ответственность за проведение

  const stories = [
 

массив, затем вы сможете использовать searchedStories его в приложении.

Но я предлагаю вам прочитать документы React немного ближе.