#ruby-on-rails #reactjs
#ruby-on-rails #reactjs
Вопрос:
Я настраиваю компонент, который в основном является выпадающим, и я пытаюсь выяснить, как установить его в положение where, когда я отправляю форму …. его набор для этого одного параметра. Когда я отправляю его сейчас, он отправляет все параметры на серверную часть, а не только тот, который я выбрал.
Вот мой компонент категории
import React, { Component } from 'react'
class Categories extends Component{
handleCatChange = (event) => {
this.setState({category: event.target.value}) <------this should set the state to whatever is selected
}
render(){
let categories = this.props.category
let value = this.props.value
let optionItems = categories.map((cat,index) => {
return <option key={index} value={value}>{cat.category}</option>
})
return (
<div>
<select onchange={this.handleCatChange} value={this.props.category}>
{this.props.category ? optionItems : <p>Loading....</p>}
</select>
</div>
)
}
}
export default Categories
А вот компонент RecipeInput с формой
import React, { Component } from 'react'
import Categories from './Categories.js'
class RecipeInput extends Component{
constructor(props){
super(props)
this.state = {
category: [],
name:'',
ingredients: '',
chef_name: '',
origin: ''
}
}
componentDidMount(){
let initialCats = [];
const BASE_URL = `http://localhost:10524`
const CATEGORIES_URL =`${BASE_URL}/categories`
fetch(CATEGORIES_URL)
.then(resp => resp.json())
.then(data => {
initialCats = data.map((category) => {
return category
})
this.setState({
category: initialCats
})
});
}
handleSubmit = (event) =>{
event.preventDefault();
this.props.postRecipes(this.state)
this.setState({
name:'',
ingredients: '',
chef_name: '',
origin: ''
})
}
render(){
return(
<div>
<form onSubmit={this.handleSubmit}>
<Categories category={this.state.category} value={this.state.category}/>
<div>
<label for='name'>Recipe Name:</label>
<input type='text' value={this.state.name} onChange={this.handleNameChange} />
</div>
<div>
<label for='name'>Country Origin:</label>
<input type='text' value={this.state.origin} onChange={this.handleOriginChange} />
</div>
<div>
<label for='name'>Chef Name:</label>
<input type='text' value={this.state.chef_name} onChange={this.handleChefChange} />
</div>
<div>
<label for='name'>Ingredients:</label>
<textarea value={this.state.ingredients} onChange={this.handleIngChange} />
</div>
<input value='submit' type='submit'/>
</form>
</div>
)
}
}
export default RecipeInput
И вот ошибка, которая возникает при отправке (кстати, ее Rails)
Я устал от нескольких способов, но не совсем понял, как использовать компонент в качестве выпадающего списка. Что мне нужно сделать?
Вот мой внутренний код, который создает запись в api
def create
recipe = Recipe.create(recipe_params)
if recipe.save
render json: recipe
else
render json: { error: "Couldn't save" }
end
end
private
def recipe_params
params.permit(:category_id,:name,:ingredients,:chef_name,:origin,category_attribute:[:category])
end
Также моя функция postRecipe
export const postRecipes = (recipe)=>{
const BASE_URL = `http://localhost:10524`
const RECIPES_URL =`${BASE_URL}/recipes`
const config = {
method: "POST",
body:JSON.stringify(recipe),
headers: {
"Accept": "application/json",
"Content-type": "application/json"
}
}
//category field
return(dispatch)=>{
fetch(RECIPES_URL,config)
.then(response => response.json())
.then(resp => {
dispatch({
type: 'Add_Recipe',
payload:{
// category:resp.category,
name: resp.name,
ingredients: resp.ingredients,
chef_name: resp.chef_name,
origin: resp.origin,
categoryId: resp.categoryId
}
})
})
//.then(response => <Recipe />)
.catch((error) => console.log.error(error))
}
}
Комментарии:
1. пожалуйста, добавьте код, в котором вы отправляете данные в api
2. @AkshayPagare Я только что поделился этим. Вы должны увидеть внизу
Ответ №1:
Редактирование кода из-за рассматриваемого изменения: доступ к выбранному значению при отправке на сервер
class Categories extends Component {
render() {
...
let optionItems = categories.map((cat, index) => {
return (
<option key={index} value={index}>
{cat.category}
</option>
);
});
...
}
}
class RecipeInput extends Component{
constructor(props){
super(props)
this.state = {
category: [],
name:'',
ingredients: '',
chef_name: '',
origin: ''
selectedValue: {}
}
}
handleSubmit(id){
this.setState({
selectedValue: this.state.category[id]
)}
}
...
}
Вы передаете onChange и значение из компонента ввода, но вы не используете их в компоненте Categories.
Добавьте свойство onChange и value в тег.
вот ссылка
import "./styles.css";
import React, { Component } from "react";
class Categories extends Component {
render() {
let categories = this.props.category;
let onChange = this.props.onChange;
let optionItems = categories.map((cat, index) => {
return (
<option key={index} value={cat.category}>
{cat.category}
</option>
);
});
return (
<div>
<select onChange={(e) => onChange(e.target.value)}>
{this.props.category.length ? optionItems : null}
</select>
</div>
);
}
}
export default function App() {
const onChange = (value) => {
console.log(value);
};
return (
<Categories
onChange={onChange}
category={[{ category: "1st" }, { category: "2nd" }]}
/>
);
}
Я обновил код.
Если вам нужно попробовать это онлайн, вы можете обратиться к моей песочнице
https://codesandbox.io/s/stackoverflow-qno-65730813-j32ce
Комментарии:
1. Я получаю состояние null, и кажется, что что-то упущено.
2. @Stitch Я обновил код и добавил ссылку на песочницу, пожалуйста, проверьте это.
3. Я внес коррективы, я полагаю, на основе вашего предложения, но, похоже, он по-прежнему отправляет все категории, а не только ту, которую я хочу отправить.
4. @Stitch Вы пробовали ссылку codesandbox?
5. Я сделал, и я внес некоторые исправления и получил его для компиляции. У меня возникла проблема со всеми категориями, отправляющимися в серверную часть, а не только с одной, для чего мне это нужно. Я обновлю свой код, чтобы показать, что у меня есть сейчас.