@aleks_web_dev

Как связать компонент формы в Vue js?

У меня есть компонент формы мне нужно передавать значение из инпутов в компонент App
Из инпута и тексареи надо взять значения и передать их в App в data
Сделал при помощи $emit но есть ли более правильные решения

Form.vue
<template>
  <div>
    <slot></slot>
    <form @submit.prevent>
      <div class="form-group">
        <label for="title">Title</label>
        <input type="text" class="form-control" id="title" v-model="title" />
      </div>

      <div class="form-group">
        <label for="text">Text</label>
        <textarea class="form-control" id="text" v-model="text"></textarea>
      </div>

      <button type="submit" class="btn btn-primary" @click="addToDo">Submit</button>
    </form>
  </div>
</template>


<script>
export default {
  name: "Form",
  data() {
    return {
      title: "",
      text: "",
    };
  },
  methods: {
    addToDo() {
      const newToDo = {
        title: this.title,
        text: this.text,
        id: Math.random(),
      };
        this.text =''; 
        this.title = '';

        this.$emit('addToDoItem',newToDo)
    },
  },
};
</script>


App.vue
<template>
  <div class="container pt-5">
    <form-component
    @addToDoItem="addToDo($event)"
    >
      <h1>ToDo list app</h1>
    </form-component>
    
    <hr />

    <ul class="list-group">
      <to-do-item 
      v-for="item in todoArr" :key="item.id"
      :title='item.title'
      :text='item.text'
      :id="item.id"
      :delite='delite'  
      > 
      </to-do-item>
    </ul>
  </div>
</template> 

<script>
import ToDoItem from './components/ToDoItem';
import FormComponent from './components/Form'

export default {
  name: 'App',
  data() {
    return {
      title:'',
      text:'',
      todoArr:[
        {
          title:'Hello 1111',
          text:'Lorem ipsum dolor sit.',
          id:Math.random()*100
        },
        {
          title:'Hello 2222',
          text:'Lorem ipsum dolor sit.',
          id:Math.random()*100
        },

      ]
    }
  },
  components: {
    ToDoItem,
    FormComponent,
  },
  methods:{
    delite(id){
      this.todoArr = [...this.todoArr].filter(item=>item.id !== id)
    },
    addToDo(obj){
      
      // const newToDo = {
      //   title:this.title,
      //   text:this.text,
      //   id:Math.random()
      // }

      // this.text ='' 
      // this.title = ''

      this.todoArr = [...this.todoArr,obj]
    }
  }
}
</script>
  • Вопрос задан
  • 504 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Я бы заменил два свойства на один объект newItem: {title:'', text:''}, передал бы его в качестве v-model в компонент.
В компоненте что-то типа такого:
...
props:['value'],
data(){return {local: null}},
watch: {
value: {handler(newVal) {this.local=newVal}, deep: true, immediate: true},
local: {handler(newVal) {this.$emit('input', newVal)}, deep: true}
}
...
Ответ написан
pomasokol
@pomasokol
Full-stack Web-dev (Django/Angular 2+/Vue)
В данном случае $emit подойдет. Если проект будет усложнятся, то нужно будет переходить на vuex (например, если нужно будет прокидывать данные через несколько компонентов, а не сразу в родительский).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы