Как отобразить компонент Vue в скрытом элементе HTML

#laravel #vue.js #vue-component

#laravel #vue.js #vue-компонент

Вопрос:

В моем приложении у меня есть правая панель слайдов, которая содержит компоненты Vue, представляющие системные уведомления. По умолчанию правая панель скрыта (за пределами экрана), и когда пользователь открывает ее, панель пуста (что означает, что компоненты не отображаются). В DevTools я вижу, что компоненты Vue не были отображены введите описание изображения здесь

Однако, если я помещу тот же код из right.blade.php в любое обычное представление, тогда будут отображаться все уведомления. введите описание изображения здесь

Пока я предполагаю, что Vue не может отображать компоненты в скрытом HTML. Я прав?

Вот скриншот, который демонстрирует представленный PHP-код и отсутствие компонента Vue, а также сам код:

скриншот правой панели

введите описание изображения здесь

rightbar.blade.php

 <div id="rightbar" class="rightbar">
    <div class="mt-2">
        <ul class="nav nav-tabs2">
            <li class="nav-item"><a class="nav-link active show" data-toggle="tab" href="#notifications">Notifications</a></li>
            <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#channels">Channels</a></li>
        </ul>
        <hr>
        <div class="tab-content">
            <div class="tab-pane show active" id="notifications">
                @foreach(auth()->user()->unreadNotifications as $key => $notification)
                        <p>here</p>    //<---------------------------this works
                        <notification props_id="{{$notification->id}}"
                                      props_route="{{route('item.show',$notification['data']['item']).'#documents'}}"
                                      props_title="New item uploaded"
                                      props_body="User {{$notification['data']['name']}} uploaded {{$notification['data']['item']}}"
                                      props_date="{{$notification->created_at}}">
    
                        </notification> //<------------------------- this doesn't works
                @endforeach
            </div>

            <div class="tab-pane" id="channels">
                <p>channel 1</p>
                <p>channel 2</p>
                <p>channel 3</p>
            </div>
        </div>
    </div>
</div>

  

Уведомление.vue

 <template>
    <transition name="slide-fade">
        <div class="card" v-show="showNotification" >
            <div class="header">
                <h2 v-text="title"></h2>
                <ul class="header-dropdown dropdown">
                    <li><a href="javascript:void(0);" @click="deleteNotification()"><i class="fa fa-close"></i></a></li>
                </ul>
            </div>
            <div style="cursor:pointer" @click="openSubject()">
                <div class="card-body">
                    <p class="card-text" v-text="body"></p>
                </div>
                <div class="card-footer">
                    <small class="text-muted" v-text="date"></small>
                </div>
            </div>
        </div>
    </transition>
</template>

<script>
    export default {
        props: {
            props_id:     String,
            props_route:  String,
            props_title:  String,
            props_body:   String,
            props_date:   String,
        },
        name: "Notification",
        data(){
            return{
                id:       this.props_id,
                route:    this.props_route,
                title:    this.props_title,
                body:     this.props_body,
                date:     this.props_body,
                showNotification: true,
            }
        },
        methods:{
            openSubject(){
                location.href = this.route;
                this.markAsRead()
            },
           markAsRead(){
               axios
                   .put("/notifications/" this.id)
                   .then(response => {
                       this.deleteNotification()
                   })
                   .catch(error => console.log(error))
           },
            deleteNotification(){
                this.showNotification = false;
            },

        },
        mounted() {
            console.log('Vue notification')
        }
    }

</script>

<style>

.slide-fade-enter-active {
    transition: all .3s ease;
}
.slide-fade-leave-active {
    transition: all .5s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
    /* .slide-fade-leave-active below version 2.1.8 */ {
    transform: translateX(1000px);
    opacity: 0;
}
</style>
  

app.js

 Vue.component('notification', require('./components/Notification.vue').default);
  

правая панель.scss

 .rightbar{
    @include box-shadow(0 5px 10px 0px rgba($dark,.3));
    @include transition(all .3s ease-in-out);
    background: $body-color;
    position: fixed;
    top: 0;
    right: -500px;
    width: 500px;
    height: 100vh;
    overflow-y: scroll;
    z-index: 13;
    padding: 8px 20px;

    amp;.open{
        right: 0;
    }

    @include max-screen($break-medium) {
        width: 450px;
    }
    @include max-screen($break-small - 1px) {
        width: 340px;
    }

    .chat_detail{
        display: block;
        position: relative;

        .chat-widget{
            height: calc(100vh - 200px);
            overflow-y: auto;
        }

        .input-group{
            position: fixed;
            bottom: 10px;
            width: 460px;

            @include max-screen($break-medium) {
                width: 410px;
            }
            @include max-screen($break-small - 1px) {
                width: 300px;
            }
        }
    }
}

  

Комментарии:

1. На вашем скриншоте вместо отображаемых элементов компонента показаны <notification> , что указывает на то, что компонент фактически не зарегистрирован.

2. @tony19 да, это зарегистрированный родительский компонент

3. @tony19 это происходит только в меню правой панели, которое прикреплено к каждому представлению. Если я сделаю то же самое в обычном представлении, это сработает

4. вероятно, что компонент зарегистрирован в вашем обычном представлении, но не в других представлениях. Как вы регистрируете компонент?

5. @tony19 ДА!!! Я забыл добавить правую панель под идентификатором, к которому я прикрепляю экземпляр приложения Vue. Позвольте мне отметить этот комментарий как ответ

Ответ №1:

На вашем скриншоте DevTools вместо отображаемых элементов компонента показаны <notification> , что указывает на то, что компонент фактически не зарегистрирован.

Я бы проверил регистрацию компонента в вашем представлении.

Комментарии:

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