Inertiajs - используйте компонент Link для добавления записи, но не можете очистить текстовое поле без использования формы

У меня есть простой тег textarea на странице с компонентом инерционной ссылки, оформленным в виде кнопки для добавления содержимого textarea в базу данных.

<script setup>

  import { ref } from "vue";
  let noteToAdd = ref('');

</script>

...

<template>

<textarea v-model = "noteToAdd"></textarea>

<Link 
  :href  = "route('notes.store')"
  method  = "post"
  as      = "button"
  :data   = "{'note': noteToAdd, 'user_id': user.id }"
>

Add Note

</Link>

... 

</template>

Метод хранилища NoteController просто проверяет содержимое текстовой области, а затем запускает для него метод создания.


namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use Inertia\Inertia;

class NoteController extends Controller;

...

public function store()
    {
        $attributes = Request::validate([
            'note'      => ['required', 'min:3'],
            'user_id'   => 'required',
        ]);

        Note::create($attributes);
    }

Все работает по плану. Содержимое заметки корректно добавляется в базу данных. Однако я не могу понять, как сбросить или очистить текстовое поле при успешном добавлении в базу данных без использования формы.

Это может показаться простым, и я, вероятно, просто слишком много думаю об этом, но все, что я вижу в документации, требует формы, а затем очистки содержимого (или отдельных полей) формы. Установка свойства v-model = '' тоже не работает?

Можно ли это сделать без формы? Если да, то как и лучше всего обрабатывать это в контроллере, в компоненте ссылки или в другом месте?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал пример на Vue SFC playground. Вы можете увидеть это здесь.

В этом примере не используется Laravel Inertia; однако концепция должна по-прежнему применяться. В вашем примере inertia/link будет использовать @onClick вместо @click, если я правильно помню.

Использование инерции

Если вы не можете использовать @onClick или @click, как показано в приведенном выше примере на inertia/link, тогда другим вариантом является добавление события маршрутизатора :

import { ref } from 'vue'
import { router } from '@inertiajs/vue3'

const noteToAdd = ref('This is here on pageload.')
const clearTextarea = () => {
  noteToAdd .value = ''
};

router.on('success', clearTextarea)
<template>
  <textarea v-model = "noteToAdd"></textarea>
  <Link 
    :href   = "route('notes.store')"
    method  = "post"
    as      = "button"
    :data   = "{'note': noteToAdd, 'user_id': user.id }"
  >
      Add Note
  </Link>
</template>

Этот код не проверен.

Однако мое личное мнение таково, что лучше всего использовать форму Inertia. Это было бы наилучшей практикой, независимо от того, будет ли код больше/меньше, чем без формы.

Спасибо, надеюсь, это поможет.

Другие вопросы по теме