Как передать массив из контроллера Laravel в компонент Vue.js

Я хочу передать массив с именем hours из контроллера Laravel в компонент Vue.js, но по какой-то причине он не работает. Как вы можете видеть в следующем коде, я пытаюсь динамически создать параметры внутри выбора, расположенного внутри компонента, но по некоторым причинам я не вижу параметров в этом массиве. В представлении я создал <p>, чтобы проверить правильность возвращаемого массива из контроллера, и, наконец, это правильно, потому что в представлении я могу видеть второе значение массива. Но по некоторым причинам я не могу визуализировать значения массива внутри компонента.

Это мой код контроллера:

    $open_at = '00:00';
    $close_at = '23:45';

    $time = new DateTime($open_at);
    $close = new DateTime($close_at);
    while ($time < $close) {
        $hours[] = $time->format('H:i');
        $time->modify('+15 minutes');
    }

    return view('create')->with('hours', $hours);

Это мой код просмотра:

@extends('layouts.app')

@section('content')
<div class = "container">
    <div id = "app">
        <create-form :hours = "hours"></create-form>
    </div>
    <p>
        {{ $hours[1] }}
    </p>
</div>
@endsection

Это код внутри компонента шаблона:

        <div class = "form-group">
            <label for = "start">Start Hour:</label>
            <select class = "form-control" id = "start">
                <option v-for = "hour in hours" :key = "hour.id">
                    {{ hour }}
                </option>
            </select>
        </div>

Это мой экспорт_по умолчанию:

export default {
    props: ['hours[]'],
    mounted() {
        console.info('Component mounted.');
        this.loadUsers();
        this.loadRooms();
    },
    data: function() {
        return {
            users: [],
            rooms: []
        }
    },
    methods: {
        loadUsers: function() {
            axios.get('api/users')
            .then((response) => {
                this.users = response.data.data;
            })
            .catch(function(error) {
                alert('noviva');
                console.info(error);
            });
        },
        loadRooms: function() {
            axios.get('api/rooms')
            .then((response) => {
                this.rooms = response.data.data;
            })
            .catch(function(error) {
                alert('noviva');
                console.info(error);
            });
        }
    }
}

Я визуализирую следующее предупреждение в консоли:

Property or method "hours" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

Может помочь?

Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Как получить URL-адрес реферера в PHP и Laravel?
Как получить URL-адрес реферера в PHP и Laravel?
Когда пользователи посещают ваш сайт, бывает полезно знать, откуда они пришли. URL-адрес реферера предоставляет информацию о странице, на которой...
Привязка маршрутной модели в Laravel
Привязка маршрутной модели в Laravel
Laravel - один из самых популярных на сегодняшний день PHP-фреймворков. Одной из его многочисленных функций является Route Model Binding, которая...
1
0
734
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Определение вашего свойства props не соответствует имени, под которым $hours передается компоненту.

props: ['hours'],

И снова у вас нет id на часах, как вы строите часы [] в контроллере, поэтому шаблон выдаст другую ошибку при попытке :key = "hour.id

Вы должны либо построить массив часов в контроллере таким образом, чтобы он имел идентификатор для каждой записи, либо (не рекомендуется) вы можете использовать индекс в цикле v-for в качестве ключа

<div class = "form-group">
    <label for = "start">Start Hour:</label>
    <select class = "form-control" id = "start">
        <option v-for = "(hour, index) in hours" :key = "index">
            {{ hour }}
        </option>
    </select>
</div>

Массивы и объекты PHP могут быть переданы в javascript/vue в качестве реквизита путем их кодирования json.

    //Using the blade helper @json
    <div id = "app">
        <create-form :hours='@json($hours)'></create-form>
    </div>

   //OR using json_encode()

    <div id = "app">
        <create-form :hours = "{{ json_encode($hours) }}"></create-form>
    </div>

Donkarnash, используя ваш фрагмент и добавив json_encode(), он работает. Кстати, почему вы предлагаете мне не использовать ваш фрагмент?

Michele Della Mea 21.12.2020 14:51

Нет, я не предлагаю вам не использовать фрагмент. В документах Vue упоминается, что не рекомендуется использовать индекс цикла в качестве :key в циклах v-for, поскольку при наличии нескольких компонентов, использующих индекс цикла в качестве ключа на одной странице, могут возникнуть некоторые побочные эффекты/непредвиденное поведение. Поэтому, если возможно, всегда используйте уникальное свойство объекта, который повторяется как :key. Тем не менее, использование индекса цикла не редкость.

Donkarnash 21.12.2020 14:57

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