【发布时间】:2020-12-20 12:32:16
【问题描述】:
我正在使用 react 和 axios 创建一个食谱应用程序。当我尝试通过在 form.js 中提交表单来添加新配方时,它不会与其他配方一起保存和显示,它只会在控制台中打印。我想这与axios有关。任何想法?。感谢任何建议,伙计们full code
form.js
import React from 'react'
import './Form.css'
import {RecipeContext} from './RecipeContext';
import {useContext,useState,useEffect} from 'react';
import axios from 'axios';
function Form() {
const [nazev,setNazev]=useState('');
const[uvodni,setUvodni]=useState('');
const[ingredience,setIngredience]=useState('');
const[postup,setPostup]=useState('');
const[time,setTime]=useState(0);
const [score,setScore]=useState(0);
const{recipes,setRecipes}=useContext(RecipeContext)
const onSubmit=e=>{
e.preventDefault()
const newRecipe={name:nazev,description:postup,ingredients:[ingredience],duration:+time,info:uvodni}
axios.post("https://cookbook.ack.ee/api/v1/recipes", newRecipe)
.then(res => setRecipes(res.data))
.catch(error => console.log(error));
}
return (
<>
<button className="pridat" onClick={onSubmit}>+</button>
<form className="form" >
<p className="nazev">Název receptu</p>
<input type="text" value={nazev}
onChange={(e) => setNazev(e.target.value)}/>
<input type="text" className="uvodni" placeholder="Úvodní text"
value={uvodni}
onChange={(e) => setUvodni(e.target.value)}/>
<h2>Ingredience</h2>
<input placeholder="Vaše ingredience" type="text"
value={ingredience}
onChange={(e) => setIngredience(e.target.value)}/>
<button>+ Přidat</button>
<input type="text" className="postup" placeholder="Postup"
value={postup}
onChange={(e) => setPostup(e.target.value)}/>
<input type="text" placeholder="Čas" className="cas" value={time}
onChange={(e) => setTime(e.target.value)}/>
</form>
</>
)
}
export default Form
recipelist.js
import {RecipeContext} from './RecipeContext';
import {useContext} from 'react';
import Recipe from './Recipe';
import './RecipeList.css'
import {Link} from 'react-router-dom'
function RecipeList() {
const {recipes}=useContext(RecipeContext)
return (
<>
<div className="navbar">
<h1>Recepty</h1>
<h3>Počet receptů:{recipes.length}</h3>
<Link to="/pridat-recept"> <h2 className="plus">+</h2></Link>
</div>
<div className="recipe-list">
{recipes.map(item=>(
<Recipe name={item.name} id={item.id} duration={item.duration} score={item.score} key={item.id}/>
))}
</div>
</>
);
}
export default RecipeList;
recipecontext.js
import React,{useState,useEffect,createContext,useReducer} from 'react';
import axios from 'axios';
import AppReducer from './AppReducer'
export const RecipeContext=createContext([[],() => {}]);
export default function RecipeProvider(props) {
const[recipes,setRecipes]=useState([])
const[state,dispatch]=useReducer(AppReducer,recipes)
function addRecipe(id){
dispatch({
type:'ADD_RECIPE',
payload:id
})
}
useEffect(() => {
axios.get('https://cookbook.ack.ee/api/v1/recipes?limit=10&offset=0')
.then(res=>setRecipes(res.data))
console.log(recipes)
})
return (
<RecipeContext.Provider value={{recipes,setRecipes,addRecipe}}>
{props.children}
</RecipeContext.Provider>
)
}
appreduce.js
export default (state,action)=>{
switch(action.type){
case 'ADD_RECIPE':
return{
...state,
recipes:[action.payload,...state.recipes]
}
default:
return state;
}
}
【问题讨论】:
-
添加RecipeContext相关的代码。您的食谱是否已保存在后端?
-
我已经加进去了
-
上下文的值似乎是一个具有三个属性的对象,但传递给
createContext([[],() => {}])的初始值是一个数组。同样在reducer中,最好在最后添加新的payload,这样旧的值就不会覆盖它,比如recipes:[...state.recipes, action.payload]。菜谱的数据类型是什么? -
我现在意识到来自 recipecontext 的 addrecipe 函数没有在表单中使用......所以这不是为什么它没有被保存到后端吗?
-
addRecipe 在您的情况下将食谱添加到食谱数组中,如果食谱没有保存在后端,这可能不是原因。此外,您还有一个
setRecipes函数,用于在发布请求后更新 FE 中的配方。纠正我上面提到的所有事情,并确保这不是后端的问题。
标签: reactjs axios react-context