@700Hp

Как написать этот код без VueJs?

Подскажите, как переписать данный код на чистом JS с fetch запросами. Попытался сделать самостоятельно, мне с сервера прихордит пустой res из body, при том в network отображает поле req payload и видно значения, что я вводил в input.

Не прошу писать мне код. Просьба направить и сказать ход логики, использовать ли мне классы в написании на чистом js. Инициализировать ли форму инпута. Интересует логика!
<div id="app" v-cloak>
  <v-app :dark="isDark">
    <v-toolbar color="blue darken-4" dark>
      <v-toolbar-side-icon></v-toolbar-side-icon>
      <v-toolbar-title class="headline">Список дел</v-toolbar-title>

      <v-spacer></v-spacer>

      <v-tooltip bottom>
        <template v-slot:activator="{ on }">
          <v-btn icon @click="show = !show" v-on="on">
            <v-icon v-model="isDark" @click="isDark = !isDark">{{ show ? 'check_circle' : 'check_circle_outline' }}
            </v-icon>
          </v-btn>
        </template>
        <span>{{isDark ? 'Светлая тема' : 'Темная тема'}}</span>
      </v-tooltip>
    </v-toolbar>
    <v-container>
      <v-layout row justify-center>
        <v-flex xs12>
          <v-card>
            <v-list two-line subheader>
              <v-container>
                <v-subheader class="headline">
                  {{new Date() | date}}
                </v-subheader>
                <v-spacer></v-spacer>

                <p class="text-xs-right"><b>{{todos.length}}</b> Задач</p>

                <v-flex xs12>
                  <v-text-field
                    clearable
                    v-model="todoTitle"
                    id="newTodo"
                    name="newTodo"
                    label="Введите название задачи"
                    @keyup.enter="addTodo"
                    :dark="isDark"
                  >
                  </v-text-field>
                </v-flex>
              </v-container>
              <v-subheader class="subheading" v-if="todos.length === 0">
                У вас 0 задач, добавьте новую
              </v-subheader>
              <v-subheader class="subheading" v-else>
                Ваши задачи
              </v-subheader>
              <div v-for="(todo, i) in todos" :key="i">
                <v-list-tile avatar>
                  <v-list-tile-action>
                    <v-checkbox
                      v-if="!todo.done"
                      v-model="todo.done"
                      :dark="isDark"
                    ></v-checkbox>
                  </v-list-tile-action>
                  <v-list-tile-content>
                    <v-list-tile-title :class="{done: todo.done}">
                      {{todo.title | capitalize}}
                    </v-list-tile-title>
                    <v-list-tile-sub-title>
                      Добавлено в: {{todo.date | date}}
                    </v-list-tile-sub-title>
                  </v-list-tile-content>
                  <v-btn icon ripple color="red" @click="removeTodo(todo.id)">
                    <v-icon class="white--text">close</v-icon>
                  </v-btn>
                </v-list-tile>
              </div>
            </v-list>
          </v-card>
        </v-flex>
      </v-layout>
    </v-container>
  </v-app>
</div>


new Vue({
  el: '#app',
  data() {
    return {
      isDark: true,
      show: true,
      todoTitle: '',
      todos: []
    }
  },
  methods: {
    addTodo() {
      const title = this.todoTitle.trim()
      if (!title) {
        return
      }
      fetch('/api/todo', {
        method: 'post',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({title})
      })
        .then(res => res.json())
        .then(({todo}) => {
          console.log(todo)

          this.todos.push(todo)
          this.todoTitle = ''
        })
        .catch(e => console.log(e))
    },
    removeTodo(id) {
      this.todos = this.todos.filter(t => t.id !== id)
    }
  },
  filters: {
    capitalize(value) {
      return value.toString().charAt(0).toUpperCase() + value.slice(1)
    },
    date(value) {
      return new Intl.DateTimeFormat('ru-RU', {
        year: 'numeric',
        month: 'long',
        day: '2-digit'
      }).format(new Date(value))
    }
  }
}}
  • Вопрос задан
  • 754 просмотра
Решения вопроса 1
Annikangl
@Annikangl
Backend developer (PHP)
Если на чистом JS, то по логике все так же. Вешаете на кнопку клик

document.querySelector("#myBtn").addEventListener('click', function (e) {
  e.preventDefault();

 fetch() 
 ...then()
 ...then()
})

Если данные с сервера не приходят - смотрите в консоль информацию об ошибках, а так же рекомендую заглянуть во вкладку Network на панели разработчика в браузере.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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