Начальный рендеринг эффекта использования нарушает значения криптограмм. Каково же решение?

#javascript #reactjs #redux #jsx

Вопрос:

Я хочу, чтобы поле ввода действовало как строка поиска и показывало мне введенные криптовалюты, но из-за начальной визуализации эффекта использования значение криптографических средств устанавливается неопределенным, и из-за этого на странице не отображается криптография. Пожалуйста, предложите любой альтернативный способ реализации этой функции, а также как я могу остановить эффект использования, чтобы получить визуализацию при запуске .

 import { Card, Row, Col, Input, Typography } from 'antd'
import React from 'react'
import { Link } from 'react-router-dom'
import { useGetCryptosQuery } from '../services/CryptoApi'
import { useState, useEffect } from 'react'
import millify from 'millify'
import { filter } from 'htmlparser2/node_modules/domutils'

const Cryptocurrencies = ( props ) => {
    const count = props.simplified ? 10 : 100;
    const { data: cryptoList, isFetching } = useGetCryptosQuery( count )
    const [cryptos, setCryptos] = useState( cryptoList?.data?.coins )
    const [searchTerm, setSearchTerm] = useState( '' )

    useEffect( () => {

        const filteredData = cryptoList?.data?.coins.filter( ( coin ) => { coin.name.toLowerCase().includes( searchTerm.toLowerCase() ) } )

        setCryptos( filteredData )
    }, [searchTerm, cryptoList] )

    console.log( cryptos )

    if ( isFetching ) {
        return "loading...";
    }



    return (
        <div>
            {
                <>
                    <div>
                        <Input placeholder="Search Cryptocurrency" onChange={( e ) => setSearchTerm( e.target.value )} className="" />
                    </div>
                    <Row gutter={[32, 32]} className="crypto-card-container">

                        {cryptos?.map( ( currency ) => {

                            return (
                                <Col xs={24} sm={12} lg={6} className="crypto-card" key={currency.id}>
                                    <Link to={`/ crypto / ${currency.id} `}>
                                        <Card
                                            title={`${currency.rank}.${currency.name} `}
                                            extra={<img className="crypto-image" src={currency.iconUrl} />}
                                            hoverable
                                        >
                                            <p>Price : ${millify( currency.price )}</p>
                                            <p>Market Cap : {millify( currency.marketCap )}</p>
                                            <p>Daily Change : {millify( currency.change )}%</p>
                                        </Card>
                                    </Link>
                                </Col>
                            )
                        } )}

                    </Row>
                </>
            }
        </div>
    )
}

export default Cryptocurrencies
 

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

1. Похоже, вы нигде не устанавливаете значение входных searchTerm данных, чего я ожидал, это намеренно?

2. Я устанавливаю значение поискового запроса, введенного пользователем, потому что в обмене на ввод я изменяю состояние поискового запроса

Ответ №1:

Просто можно добавить условный if оператор для решения проблемы.

Давайте взглянем на то useEffect , как вы описали в компоненте, который монтировался, searchTerm это все еще пустая строка. Путем добавления простого if оператора для проверки seatchTerm значения, filteredData и setCryptos методы работают только тогда, когда searchTerm содержит строку минимум из одной буквы.

 useEffect( () => {
  if(searchTerm.length > 0) {
    const filteredData = cryptoList?.data?.coins.filter((coin) => { coin.name.toLowerCase().includes(searchTerm.toLowerCase())})
    setCryptos(filteredData)
  }
 }, [searchTerm, cryptoList] )