【问题标题】:Initialize state in async function within context/provider react native在上下文/提供者反应原生的异步函数中初始化状态
【发布时间】:2020-08-24 21:45:42
【问题描述】:

我正在使用上下文挂钩来处理本机反应中的状态。我想通过执行 API 调用的异步函数初始化状态,然后通过 useState 返回初始状态。那是我尝试为“touristyOptions”设置初始状态,但这不起作用。我怀疑是因为异步功能?

**This is my Context/Provider**
    import React, { useState, useEffect } from "react";
import * as firebase from "firebase";
import { levelTables } from "../config/config";

const LevelOptionsContext = React.createContext();

const LevelOptionsProvider = (props) => {
  
  const setLevelOptions = (type) => {
    let categoryRef = firebase
      .database()
      .ref(type)
      .orderByKey();
    categoryRef
      .once("value")
      .then((snapshot) => {
        let result = [];
        snapshot.forEach(function(childSnapshot) {
          let value = childSnapshot.val();
          result.push({ value, active: false });
        });
        return [...result];
      })
      .catch((error) => console.log(error))
  };

  const [touristyOptions, setTouristyOptions] = useState(
    setLevelOptions("touristy_level")
  );
  const [adventurouseOptions, setAdventurouseOptions] = useState([]);

  return (
    <LevelOptionsContext.Provider
      value={{
        adventurouseOptions,
        setAdventurouseOptions,
        touristyOptions,
        setTouristyOptions
      }}
    >
      {props.children}
    </LevelOptionsContext.Provider>
  );
};

export { LevelOptionsContext, LevelOptionsProvider };
This does not work. Anyone can give a hint?

【问题讨论】:

    标签: reactjs react-native react-hooks use-state use-context


    【解决方案1】:

    请试试这个。

    import React, { useState, useEffect } from "react";
    import * as firebase from "firebase";
    import { levelTables } from "../config/config";
    
    const LevelOptionsContext = React.createContext();
    
    const LevelOptionsProvider = (props) => {
      const [touristyOptions, setTouristyOptions] = useState([]);
      const setLevelOptions = (type) => {
        let categoryRef = firebase
          .database()
          .ref(type)
          .orderByKey();
        categoryRef
          .once("value")
          .then((snapshot) => {
            let result = [];
            snapshot.forEach(function(childSnapshot) {
              let value = childSnapshot.val();
              result.push({ value, active: false });
            });
            setTouristOptions(result)
          })
          .catch((error) => console.log(error))
      };
      useEffect(() => { setLevelOptions(); }, []);
      return (
    //    ...
      );
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多