我是一个初学者,并开始了我自己的小项目与拉拉,vue和顺风-css。对不起我的英语不好。我有以下问题:如果我切换路由或重新加载页面,我的表单组件呈现的状态是它没有准备好获取数据并加载我猜的CSS类。当我切换路由或重新加载时,您可以看到表单和所有样式类是如何建立起来的。这就是我不喜欢的。当组件处于就绪状态时,我希望得到它的呈现。
我添加了一个小的gif,我多次重新加载页面,这样您就可以看到问题了。https://imgur.com/a/yN5S4VZ (Gif on Imgur)
我的代码如下所示:EditProfile.vue
<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
<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>发布于 2020-12-26 17:19:25
您可以添加一个条件,该条件仅在获取数据时显示组件:
<EditProfileForm v-if="user" :user="user" class="flex-grow"></EditProfileForm>发布于 2020-12-26 17:25:42
您试图实现的是服务器端呈现。因此,当页面从服务器返回时,您已经有了用户,并且表单中没有闪烁。
在这里,Vue做它应该做的事。当您在浏览器中加载页面时,它的获取用户。在浏览器中加载页面之前,它无法执行该操作。
目前,使用Laravel和PHP,您似乎无法为Vue实现SSR。但是,您可以在用户加载时简单地显示占位符。
试着做些像
<EditProfileForm v-if="user" :user="user" class="flex-grow"></EditProfileForm>
<MyProgressIndicator v-else />您可以使用顺风和vue创建一个简单的进度指示器。
或者,如果您可以使用像在顺风文档中那样的骨架装载机,效果会更好
编辑:对于像这个一这样的Laravel,似乎没有什么解决办法。
https://stackoverflow.com/questions/65458409
复制相似问题