首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue组件显示时未准备就绪

Vue组件显示时未准备就绪
EN

Stack Overflow用户
提问于 2020-12-26 16:26:37
回答 2查看 166关注 0票数 1

我是一个初学者,并开始了我自己的小项目与拉拉,vue和顺风-css。对不起我的英语不好。我有以下问题:如果我切换路由或重新加载页面,我的表单组件呈现的状态是它没有准备好获取数据并加载我猜的CSS类。当我切换路由或重新加载时,您可以看到表单和所有样式类是如何建立起来的。这就是我不喜欢的。当组件处于就绪状态时,我希望得到它的呈现。

我添加了一个小的gif,我多次重新加载页面,这样您就可以看到问题了。https://imgur.com/a/yN5S4VZ (Gif on Imgur)

我的代码如下所示:EditProfile.vue

代码语言:javascript
复制
<template>
<div class="wrapper">
    <NavbarAuthenticated></NavbarAuthenticated>
    <div class="flex ...">
        <Sidebar class="flex-none"></Sidebar>
        <EditProfileForm :user="user" class="flex-grow"></EditProfileForm>
    </div>

</div>
</template>

<style>
.bg-custom-blue {
    background-color: #F8FAFC;
}
</style>

<script>
import NavbarAuthenticated from '../authenticated/NavbarAuthenticated'
import Sidebar from '../components/Sidebar'
import EditProfileForm from '../components/EditProfileForm'

export default {
    data() {
        return {
            user: null
        }
    },
    created() {
        axios.get('/api/user').then((res) => {
            this.user = res.data
        });
    },
    components: {
        NavbarAuthenticated,
        Sidebar,
        EditProfileForm

    },
}
</script>

EditProfileForm.vue

代码语言:javascript
复制
<template>
<div class=" min-h-screen pt-2 ">

    <div class="container ">

        <div class="inputs w-full max-w-2xl pb-20 pl-3 pt-9 ">

            <h2 class="text-2xl text-gray-900">Account Setting</h2>
            <form class="mt-6 border-t border-gray-400 pt-4">
                <div class='flex flex-wrap -mx-3 mb-6'>
                    <div class='w-full md:w-full px-3 mb-6'>
                        <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2' for='grid-text-1'>email address</label>
                        <input class='appearance-none block w-full bg-white text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' id='grid-text-1' type='text' v-if="user" v-model.lazy="user.email">
                    </div>

                    <div class='w-full md:w-full px-3 mb-6 '>
                        <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>password</label>
                        <input readonly class='appearance-none block w-full bg-gray-100 text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' type='text' placeholder="**********">
                        <div class="flex justify-end">

                            <router-link class=" bg-gray-200 hover:bg-gray-300 border border-gray-400 text-black font-bold py-2 my-2 px-6 rounded-md" to="resetpassword">Passwort ändern</router-link>
                        </div>
                    </div>

                    <div class="personal w-full border-t border-gray-400 pt-4">
                        <h2 class=" pb-6 text-2xl text-gray-900">Personal info:</h2>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Name</label>
                            <input readonly class='appearance-none block w-full bg-gray-100 text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' v-if="user" v-model="user.name" type='text'>
                        </div>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Straße</label>
                            <input class='appearance-none block w-full bg-white text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none focus:border-gray-500' v-if="user" v-model="user.strasse" type='text'>
                        </div>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Hausnummer</label>
                            <input class='appearance-none block w-full bg-white text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' v-if="user" v-model="user.hausnummer" type='number'>
                        </div>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Postleitzahl</label>
                            <input class='appearance-none block w-full bg-white text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' v-if="user" v-model="user.postleitzahl" type='text'>
                        </div>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Ort</label>
                            <input class='appearance-none block w-full bg-white text-gray-700 border border-gray-400 shadow-inner rounded-md py-3 px-4 leading-tight focus:outline-none  focus:border-gray-500' v-if="user" v-model="user.ort" type='text'>
                        </div>

                        <div class='w-full md:w-full px-3 mb-6'>
                            <label class='block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2'>Land</label>
                            <div class="flex-shrink w-full inline-block relative">
                                <select class="block appearance-none text-gray-600 w-full bg-white border border-gray-400 shadow-inner px-4 py-2 pr-8 rounded" v-if="user" v-model="user.land">
                                    <option>Deutschland</option>
                                    <option>USA</option>
                                    <option>Frankreich</option>
                                    <option>Spanien</option>
                                    <option>England</option>
                                </select>
                                <div class="pointer-events-none absolute top-0 mt-3  right-0 flex items-center px-2 text-gray-600">
                                    <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
                                        <path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" /></svg>
                                </div>
                            </div>
                        </div>

                        <div class="flex justify-start">
                            <button @click.prevent="saveData(user)" class="mr-4 bg-green-500 ml-3 hover:bg-blue-700 text-white font-bold py-2 px-3 rounded-lg">
                                Änderungen speichern
                            </button>

                        </div>

                        <p @click.prevent="pushModal" class="flex justify-start mx-6 mt-4 text-xs text-gray-500 cursor-pointer hover:text-black">Account löschen</p>
                        <button v-if="showModal" @click.prevent="deleteAccount(user)" class="mr-4 mt-4 bg-red-500 ml-3 hover:bg-red-700 text-white font-bold py-2 px-3 rounded-lg">
                            Account löschen
                        </button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
</template>

<style>
</style>

<script>
export default {
    name: 'user',
    props: {
        user: {
            type: Object

        }
    },
    errors: [],
    data() {
        return {
            showModal: false,
        }
    },
    methods: {
        saveData(user) {
            axios.patch('/api/updateUser/' + user.id, user).then(() => {}).catch((error) => {
                this.errors = error.response.data.errors;
            });
        },
        deleteAccount(user) {
            axios.delete('/api/updateUser/' + user.id, user).then(() => {
                this.$router.push({
                    name: "Home"
                });

            }).catch((error) => {
                this.errors = error.response.data.errors;
            });
        },

        pushModal() {
            this.showModal = true;
        },
        hideModal() {
            this.showModal = false;
        }
    }
}
</script>
EN

回答 2

Stack Overflow用户

发布于 2020-12-26 17:19:25

您可以添加一个条件,该条件仅在获取数据时显示组件:

代码语言:javascript
复制
<EditProfileForm v-if="user" :user="user" class="flex-grow"></EditProfileForm>
票数 0
EN

Stack Overflow用户

发布于 2020-12-26 17:25:42

您试图实现的是服务器端呈现。因此,当页面从服务器返回时,您已经有了用户,并且表单中没有闪烁。

在这里,Vue做它应该做的事。当您在浏览器中加载页面时,它的获取用户。在浏览器中加载页面之前,它无法执行该操作。

目前,使用Laravel和PHP,您似乎无法为Vue实现SSR。但是,您可以在用户加载时简单地显示占位符。

试着做些像

代码语言:javascript
复制
<EditProfileForm v-if="user" :user="user" class="flex-grow"></EditProfileForm>
<MyProgressIndicator v-else />

您可以使用顺风和vue创建一个简单的进度指示器。

或者,如果您可以使用像在顺风文档中那样的骨架装载机,效果会更好

编辑:对于像这个这样的Laravel,似乎没有什么解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65458409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档