Vue js не перерисовывает высоту страницы после перенаправления на другую страницу - PullRequest
0 голосов
/ 20 сентября 2018

Здравствуйте, уважаемые разработчики!

Я новичок в Vue.js и сейчас борюсь за одну визуальную проблему.При перемещении пользователя с navbar на предыдущую страницу через <b-dropdown-item @click="go_login">Login</b-dropdown-item>, где go_login () =

go_login: function () { this.$router.push('/login') }

страница перенаправляется накомпонент login , но высота страницы не обновляется.Этого не происходит, если вместо этого вы используете href="/login" или вводите адрес непосредственно в адресной строке браузера, но я не хочу (не хотел бы) использовать href.

Чего мне не хватает?

Мой код:

router / index.js

import Vue from 'vue'
import Router from 'vue-router'
import store from '../store/store'
import userLogin from '../views/userLoginPage'
import landingPage from '../views/landingPage'
import admin from '../views/admin'
import userRegistration from '../views/userRegistration'
import userPasswordReset from '../views/userPasswordReset'
import pageNotFound from '../views/404'
import userProfile from '../views/userProfile'

Vue.use(Router)

// checks if user is authenticated and allowed to se the page
const ifAuthenticated = (to, from, next) => {
  if (store.getters.isAuthenticated) {
    next()
    return
  }
  next('/login')
}

/**
 * icon names can be found on fontawesome page
 * for example https://fontawesome.com/icons/volume-up?style=solid
 */
export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'landingPage',
      component: landingPage,
      props: {msg: 'Welcome to Tonefeed!', icon: 'volume-up'}
    },
    {
      path: '/login',
      name: 'userLogin',
      component: userLogin,
      props: {msg: 'Sign in', icon: 'key'}
    },
    {
      path: '/profile',
      name: 'userLProfile',
      component: userProfile,
      props: {msg: 'Profile', icon: 'user'},
      beforeEnter: ifAuthenticated
    },

    // for testing purposes guests are not allowed to see this page
    {
      path: '/admin',
      name: 'bootstrapExamples',
      component: admin,
      props: {msg: 'Admin', icon: 'user-ninja'},
      beforeEnter: ifAuthenticated
    },
    {
      path: '/register',
      name: 'register',
      component: userRegistration,
      props: {msg: 'Registration', icon: 'pen-alt'}
    },
    {
      path: '/password-reset',
      name: 'userPasswordReset',
      component: userPasswordReset,
      props: {msg: 'Password reset', icon: 'unlock'}
    },
    {
      path: '/404',
      name: 'pageNotFound',
      component: pageNotFound,
      props: {msg: '404', icon: 'exclamation-triangle'}
    },
    // if url is unknown => redirect to 404
    {
      path: '*',
      redirect: '/404'
    }
  ],
  scrollBehavior (to, from, savedPosition) {
    return { x: 0, y: 0 }
  }
})

компонентов / navigationBar.vue

<template>
  <b-navbar :class="{'classA navbar-dark': scrollPosition < 64, 'classB navbar-light': scrollPosition > 64}"
            toggleable="md">

    <b-navbar-toggle target="nav_collapse"></b-navbar-toggle>

    <b-navbar-brand>
      <font-awesome-icon :icon="icon"></font-awesome-icon>
      Tonefeed
    </b-navbar-brand>

    <b-collapse is-nav id="nav_collapse">

      <b-navbar-nav>
        <b-nav-item>Column 1</b-nav-item>
        <b-nav-item>Column 2</b-nav-item>
      </b-navbar-nav>

      <!-- Right aligned nav items -->
      <b-navbar-nav class="ml-auto">

        <b-nav-form>
          <b-form-input size="sm" class="mr-sm-2" type="text" placeholder="Search"/>
          <button
            :class="{'button btn btn-outline-primary btn-sm': scrollPosition < 64, 'button btn btn-outline-secondary btn-sm': scrollPosition > 64}">
            Search
          </button>
        </b-nav-form>

        <b-nav-item-dropdown text="Lang" right>
          <b-dropdown-item>EN</b-dropdown-item>
          <b-dropdown-item>DE</b-dropdown-item>
          <b-dropdown-item href="/login">RU</b-dropdown-item>
        </b-nav-item-dropdown>

        <b-nav-item-dropdown text="User" right>
          <b-dropdown-item @click="go_profile">Profile</b-dropdown-item>
          <b-dropdown-item @click="go_home">Logout</b-dropdown-item>
          <b-dropdown-item @click="go_login">Login</b-dropdown-item>
          <b-dropdown-item @click="go_register">Register</b-dropdown-item>
        </b-nav-item-dropdown>
      </b-navbar-nav>

    </b-collapse>
  </b-navbar>
</template>

<script>
export default {
  name: 'navBar',
  data () {
    return {
      scrolled: false,
      scrollPosition: null
    }
  },
  props: {
    icon: String
  },
  methods: {
    go_login: function () {
      this.$router.push('/login')
    },
    go_home: function () {
      this.$store.dispatch('AUTH_LOGOUT')
        .then(() => {
          this.$router.push('/')
        })
    },
    go_register: function () {
      this.$router.push('/register')
    },
    go_profile: function () {
      this.$router.push('/profile')
    },
    handleScroll () {
      this.scrolled = window.scrollY > 0
      this.scrollPosition = window.scrollY
    }
  },
  mounted () {
    window.addEventListener('scroll', this.handleScroll)
  },
  destroy () {
    window.removeEventListener('scroll', this.handleScroll)
  }
}
</script>

<style>
  .classA.navbar-dark {
    position: fixed;
    width: 100%;
    background: transparent;
    transition: .5s ease-in-out;
  }

  .classB.navbar-light {
    position: fixed;
    width: 100%;
    background: white;
    transition: .5s ease-in-out;
  }

  .topnav a:hover {
    background-color: white;
    color: black;
  }
</style>

App.vue

<template>
  <div class="container-fluid">
    <div>
      <navigationBar v-bind:icon="icon"></navigationBar>
    </div>
    <div id="app" class="container">
      <router-view :key="$route.fullPath"></router-view>
    </div>
  </div>
</template>

<script>
import navigationBar from './components/navigationBar'

export default {
  name: 'app',
  data () {
    return {
      icon: 'volume-up'
    }
  },
  components: {
    navigationBar: navigationBar
  },
  // if token expires the user should log out
  created: function () {
    this.axios.interceptors.response.use(undefined, function (err) {
      return new Promise(function (resolve, reject) {
        if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
          // if you ever get an unauthorized, logout the user
          this.$store.dispatch('AUTH_LOGOUT')
          // you can also redirect to /login if needed !
        }
        throw err
      })
    })
  }
}
</script>

<style lang="scss">
  @import './styles/custom-bootstrap.scss';
  @import '../node_modules/bootstrap/scss/bootstrap.scss';

  body {
    background: url("./assets/overlay2.png"), url("./assets/overlay3.svg");
    background-position: top left, center center;
    background-size: auto, cover;
    background-attachment: fixed;
  }

  .container-fluid{
    padding: 0;
    display: flex;
    flex-direction: column;
  }

  #app {
    padding-top: 4rem;
  }

  a, a:hover {
    color: white;
    text-decoration: none;
  }
</style>

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, что проблема, с которой вы сталкиваетесь, связана с тем, что страница не обновляется при использовании: (поскольку это одностраничное приложение)

this.$router.push('/login')

Когда вы используете hrefдля навигации он обновляет все содержимое страницы, как и при непосредственном вводе URL.

Таким образом, чтобы компонент принял фактическую ширину и высоту, вы должны использовать:

location.reload(); // in the components life cycle hook

Пожалуйста, скажите, сработало ли это для вас.

...