Я попытался использовать стилизованный компонент в своем приложении. Но курсор перемещается после того, как я пишу название города

#css #reactjs #styled-components

#css #reactjs #styled-components

Вопрос:

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

 import React, { FC, useState, FormEvent } from 'react';
import { useDispatch } from 'react-redux';
import styled from 'styled-components';
import { setAlert } from '../store/actions/alertActions';
import { getWeather, setLoading } from '../store/actions/weatherActions';

interface SearchProps {
  title: string;
}


const Search: FC<SearchProps> = ({ title }) => {
  const dispatch = useDispatch();
  const [city, setCity] = useState('');

  const changeHandler = (e: FormEvent<HTMLInputElement>) => {
    setCity(e.currentTarget.value);
  }

  const submitHandler = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();

    if(city.trim() === '') {
      return dispatch(setAlert('City is required!'));
    }

    dispatch(setLoading());
    dispatch(getWeather(city));
    setCity('');
  }
   
  const Header = styled.h1`
    font-size: 40px;
    font-family:  'sans-serif';
    padding-top: 30px;
  `;

  const Input = styled.input`
    font-size: 18px;
    padding: 10px;
    margin: 10px;
    background: #b4e6df;
    border: none;
    border-radius: 3px;
    ::placeholder {
      color: black;
      
    }
  `;

  const Button = styled.button`
    background-color: #10e2f1;
    font-size: 20px;
    color: white;
    margin: 1em;
    border: 3px;
    padding: 0.25em 6em;
    
  `;
  return(
    <>
          <Header >{title}
          <form  onSubmit={submitHandler}>
            <Input 
              type="text"
              placeholder="Enter city name"
              value={city}
              onChange={changeHandler}
            />
            <br/>
            <Button >Search</Button>
          </form>
          </Header>
    </>
  );  
}

export default Search;
 

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

1. Сначала я бы добавил функцию регулирования. Это означает, что вы не запускаете новый запрос api, пока пользователь вводит текст. С другой стороны, я не вижу вашего поискового ввода. Убедитесь, что он не будет повторно отображаться, если ваш запрос-результаты обновлены.

2. Где вы пытаетесь ввести? Я не вижу никакого кода элемента ввода в приведенном выше коде.

3. @Mr_Green Теперь я исправил код. Извините, я скопировал неправильный код ранее.

Ответ №1:

Похоже, значение меняется (или обновляется) всякий раз, когда вы вносите изменения во входные данные, поскольку оно привязано к состоянию, а также состояние обновляется по onChange событию. Сохраняйте независимое значение вместо переменной состояния в value атрибуте. что-то вроде этого:

 const defaultValue = ''; // or the default value you are getting from props
const [city, setCity] = useState(defaultValue);

---
---
<Input 
    type="text"
    placeholder="Enter city name"
    value={defaultValue}
    onChange={changeHandler}
/>
 

Дайте мне знать, работает это или нет.

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

1. @YajnaseniPanda проверьте мое обновление. Дайте мне знать

2. Я попробовал это, но столкнулся с той же проблемой. Однако, когда я попытался установить const changeHandler = (e: FormEvent<HTMLInputElement>) => { setCity(e.currentTarget.defaultValue); } тогда я могу ввести весь город, но он по-прежнему показывает, что требуется город

3. теперь мой код работает на самом деле, я поместил весь стиль внутри функции поиска, и стиль был локальным. Теперь я определил их глобально, так что это работает. Спасибо 🙂