Как решить выпадающий ввод, получая отраженные значения, вставленные пользователем в редуксе - PullRequest
1 голос
/ 05 марта 2020

Я использую избыточную форму и хочу, чтобы значения были вставлены пользователем при редактировании формы. С другим вводом у меня нет никаких проблем, только с выпадающим списком (выберите компонент).

Я использую компонент класса с именем ServiceForm, который находится внутри функционального компонента с именем renderTodos. Раскрывающийся список «relatedTodos» возвращает мне все задачи от api rest.

Это мой компонент класса:

           componentWillReceiveProps = nextProps => {
                // Load Contact Asynchronously
                   const { service } = nextProps;
                   if (service._id !== this.props.service._id) {
                   // Initialize form only once
                   this.props.initialize(service);
                   this.isUpdating = true;
                   }
                   };


                    componentDidMount(){

                         this.props.searchTodos();
                        }
                     constructor(props){
                           super(props);

                        this.state = {
                           //LOOK THE FOLLOWING LINE PLEASE
                           todo: props.todo.name};
                           };



                                onChange = (e) =>{
                                      this.setState({
                                      todo: e.target.value
                                          })
                                            } 



                      renderArrayTodos = ({fields, meta: { error,submitFailed}},input) => (
                          <dl>
                            <dt>
                              <button type="button" className='btn btn-primary' style= 
                               {{fontWeight:'bold',color:'black'}} onClick={() => 
                            fields.push()}>Add todo</button>
                             {submitFailed && error && <span>{error}</span>}
                                   </dt>
                               { fields.map((relatedTodo, index) =>

                                  <dd key={index}>
                          <br></br>
                     <button className='btn btn-primary' style={{fontWeight:'bold',color:'black'}}
                             type="button"
                              title="Remove Todo"
                                onClick={() => { fields && fields.remove(index)

                               }}> Remove </button>

                           <h4><b>Todo's widget number {index + 1}</b></h4>


                              <div className="row" style={
                                 {textAlign: 'center',
                                     justifyContent: 'center',
                                     paddingRight: 20,
                                     margin: '10 10px 10 10px'

                                    }}>

                                  <label style={{fontStyle: 
                             'arial',fontWeight:'bold',fontSize:17}}>Todo:</label> 


                              <Field
                                   className="custom-select d-block w-100" name={`${relatedTodo}`} 
                          value={this.state.todo} onChange={this.onChange.bind(this)} 
              component="select" placeholder={!input.value ? 'Please, insert a todo' : input.value}>

                            {/* <option value="" hidden style={{fontStyle: 
                           'arial',fontWeight:'bold'}}>Please, select a todo</option> */}

                              {/*PLACEHOLDER FOR TODO SELECT IN SERVICE FORM: Please, select a todo 
                           when I'm CREATING a service,ON THE CONTRARY when I'm EDITING a service, 
                            the placeholder will be the reflected todo value I inserted when I 
                            created the service.    e.g.   I inserted todo 5, when I'm EDITING the 
                         created service, only todo I inserted should be showed like todo 5. */}

                                       <option value={input.value} hidden style={{fontStyle: 
                        'arial',fontWeight:'bold'}}>{!input.value ? 'Please, select a todo' 
                      : input.value}</option>

                                { this.props.todoList.map(todo => {

                                       return(
                                      <option  key={todo._id}  value={todo._id} style={{fontStyle: 
                                       'arial',fontWeight:'bold'}} >{todo.name}</option>
                                                )
                                                 })}

                                                </Field> 


                                                    </div> 

                                                      </dd>
                                                   )
                                                    }

                                   {error && <dt className="error">{error}</dt>}
                                          </dl> 
                                   );

Здесь я соединяю действие под названием "searchTodos и todoList (reducer)" с api:

             const actions = {

                    searchTodos

                     }; 

                    function mapState(state){

                         return {
                    todoList: state.todosSoftware.todoList
                      }
                       } 




                     ServiceForm= connect(mapState,actions)(ServiceForm); 

Раскрывающийся список, называемый «relatedTodos», и это todos в следующем порядке: «todo 1, todo 2, todo 3, todo 4, todo 5».

Когда я Создаю сервис

                               e.g.

Я помогаю своему сервису, нажимаю на кнопку «добавить задачу». Добавьте поле с именем ${relatedTodo}. Я выбираю

                               e.g.

todo 5.

Когда я редактирую созданный сервис только с одним назначенным todo, заполнитель Dropdown должен сказать "todo 5" not ", пожалуйста, выберите todo" или первый элемент раскрывающегося списка, который называется «todo 1».

С другой стороны, когда я редактирую сервис, у меня появляется эта ошибка: «не могу прочитать имя undefined». Эта ошибка находится в следующей строке кода.

            constructor(props){

                 super(props);

                     this.state = {

                        //IN THE FOLLOWING LINE IS THE ERROR

                           todo: props.name.todo
                          }


                    }

При редактировании службы в форме службы значения выбора отражают значения, введенные пользователем.

...