Как сохранить значение параметра select, объявленного в методе componentDidMount, для использования во всех компонентах

#javascript #reactjs #ecmascript-6

#javascript #reactjs #ecmascript-6

Вопрос:

я извлекаю API из источника. И это было успешно. Но я хочу, чтобы значение выбранного параметра сохранялось при нажатии, но всякий раз, когда я нажимаю на него, он отображается, и после того, как я перейду в другой раздел и вернусь к нему, он сбросится.

У меня есть форма входа в систему с шагами, шаги похожи на кнопки -> Next и previous, просто для сохранения и перехода к следующему от до последнего ввода, затем отправки. И я извлек API с componentDidmount помощью метода. Это работало так хорошо, но всякий раз, когда я нажимал на выпадающие меню выбора и выбирал нужный вариант, это срабатывало, и если я перейду к следующему шагу, другие входные данные будут сохранены, но он не будет сохранен.

Вот мой код.

 //my componentDidmount method

constructor(props) {
        super(props);
        this.state = { 
            skills: null
         };
    }

    fetchSkills = () => {
        fetch('https://my_api_link')
        .then(res => res.json())
        .then(skills => {
            this.setState({
                skills: skills.map(s => s.ssp_skill_name)
            })
        });
    };

    componentDidMount() {
        this.fetchSkills();
    }
 
 //how I used it

<div className="form-group mb-4" style={{maxWidth: "25rem"}}>
      <label htmlFor="skills">Skills:</label>
        {this.state.skills amp;amp; (
           <select className="form-control email_input">
            {this.state.skills.map(s => (
               option key={s}>{s}</option>
             ))}
         </select>
       )}
   </div>
 

Ответ №1:

вы можете использовать одну из множества библиотек для поддержки этого случая (useSWR, react-query, redux-toolkit, easy-peasy и многое другое). Но если вы хотите реализовать решение без новых dep, вы можете использовать для этого контекст.

 
const skillsContext = React.createContext()

export default function SkillsContext(props) {
  const [skills, setSkills] = React.useState([])

  React.useEffect(() => {
    fetch('https://my_api_link')
        .then(res => res.json())
        .then(skills => {
            setSkills(skills.map(s => s.ssp_skill_name))
        });
  },[]}

  return <skillsContext.Provider value={skills}>{props.children}</skillsContext.Provider>
}

export default useSkills = React.useContext(skillsContext)
 

поместите <SkillContext> в корневой каталог вашего приложения, а затем получите доступ к значению из useSkills любого места вашего приложения.


если вы используете синтаксис компонента, вы можете получить к нему доступ через статический contextType , например, так:

 class SomeComponent extends Component {
  static contextType = SkillsContext

  render() {
    this.context
  }
}
 

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

1. если это тот ответ, который вы ищете, пожалуйста, примите его. В противном случае, что мне нужно добавить?