【问题标题】:Setting initial values of a form via an API call通过 API 调用设置表单的初始值
【发布时间】:2020-07-17 18:09:20
【问题描述】:

在我的 React 游戏中,我将一个名为 Formik 的 React 库用于表单。

在其中,您可以像这样设置表单的初始值:

<Formik
    initialValues={{
        characterClasses: ["1", "3", "9"],
        race: "Elf",
        name: "Derolt",
        age: "84",
        
        ..etc
        

但现在,我想从 API 调用中加载初始值。

所以我创建了这个:

const fetchGameCharData = async (gameId) => {
    const game = await axios("api/games/" + gameId);
    // return the result
    return game;
};

我的问题是,我不知道如何使用上述 fetch 方法来实际填充 Formik 使用的 initialValues 部分。

有人做过吗?

谢谢!

【问题讨论】:

    标签: reactjs react-hooks formik


    【解决方案1】:

    使用conditional-rendering 方法。

    只有在您收到 API 调用的响应后才加载您的表单。显示loading... 或自定义spinner,直到您获得API 响应。

    使用这种方法,您的表单可以直接使用initial values 加载,而不会在第一次加载时出现没有任何值的闪烁,并且由于 API 响应,值会在瞬间出现。

    编辑

    // In your state add two values like
    initialValues: [],
    isValueLoded: false
    
    ...
    
    // Make your API call in `componentDidMount`
    componentDidMount() {
        // Call your API
        fetchGameCharData(....).then(res => {
            this.setState({ isValueLoded: true, initialValues: res.values});
        }).catch(err => ....);
    }
    
    ....
    
    // In your render method
    render() {
    
        return !this.state.isValueLoded ?
           (<div>Loading...</div>) : (
            <Formki
              values={this.state.initialValues}
             ....
             />
        );
    }
    

    【讨论】:

    • 我不确定我是否理解。所以我有我的 API 调用......它如何运行并自动加载到 InitialValues 中?谢谢!
    • 为您更新了示例代码。您可以根据自己的要求即兴创作。如果您使用function component,@yash 答案会帮助您。方法同上。
    【解决方案2】:

    如果你使用的是类组件:

    componentDidMount() {
        this.fetchGame();
    }
    
    async fetchGame() {
        const game = await fetchGameCharData(GAME_ID);
        this.setState({ game });
    }
    ...
    // in render method
    const { game } = this.state;
    ...
    <Formik
        initialValues={game}
    ...
    

    如果您使用的是功能组件:

    const { game, setGame } = useState();
    
    useEffect(async () => {
        const game = await fetchGameCharData(GAME_ID);
        setGame(game);
    }, []);
    
    ...
    // in return
    <Formik
        initialValues={{
            characterClasses: ["1", "3", "9"],
            race: "Elf",
            name: "Derolt",
            age: "84",
            ...
        }}
        values={game}
    ...
    
    

    确保仅在game 可用时才呈现Formik。 否则会出错,因为initialValues 要求对象具有表单所需的所有属性。

    【讨论】:

    • 谢谢,但这是一个使用 React 钩子的功能组件...
    • 这个案例也被添加了
    • 我不明白的一件事是 Formik 文档为单个项目设置了价值......比如......名字:“Fred”,年龄:“30”,PlayerClass:“Wizard” .....等
    • 每个属性值都分配给适当的表单控件
    • 我认为values 会比initialValues 更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多