nuxt的生命周期

5,555 阅读1分钟

生命进程

红框内的是Nuxt的生命周期(运行在服务端),黄框内同时运行在服务端&&客户端上,绿框内则运行在客户端 引用 www.jianshu.com/p/840169ba9…

1.红框、黄框内的周期都不存在Window对象

2.nuxtServerInit

vuex===状态树

如果在状态树中指定了 nuxtServerInit 方法,Nuxt.js 调用它的时候会将页面的上下文对象作为第 2 个参数传给它(服务端调用时才会酱紫哟)。当我们想将服务端的一些数据传到客户端时,这个方法是灰常好用的。

举个例子,假设我们服务端的会话状态树里可以通过 req.session.user 来访问当前登录的用户。将该登录用户信息传给客户端的状态树,我们只需更新 store/index.js 如下:

actions: {
  nuxtServerInit ({ commit }, { req }) {
    if (req.session.user) {
      commit('user', req.session.user)
    }
  }
}

3.middleware

  • 1 layout
  • 2 nuxt.config.js

3.校验参数

如果校验失败,则自动跳转到错误页面

<script>
export default {
  validate({ params, query }) {
    return /^d+$/.test(params.id) // must be number
  }
}
</script>

4. fetch和asyncData

fetch方法用于渲染页面(页面组件加载前被调用【服务端或切换至目标路由之前】)前填充应用的状态树(store)数据,与asyncData方法类似,不同的是它不会设置组件的数据。

第一个参数是页面组件的上下文对象context

为了让获取过程可以异步,需要返回一个promise,Nuxt.js会等这个promise完成后再渲染组件。

  <template>
      <h1> {{ $store.state.stars }}</h1>
  </template>
  <script>
    fetch({ store, params }) {
      return axios.get('http://my-api/stara')
      .then((res) => {
          store.commit('setStars', res.data)
       })
    }
    // 或者用async/await
    async fetch({ store, params }) {
      const { data } = axios.get('http://my-api/stara')
      store.commit('setStars', data)
    }
  </script>

fetch中调用异步获取数据并操作store,推荐使用store.dispatxh

<script>
   async fetch({ store, params }) {
      await store.dispatch('GET_STARS')
   }
<script>

// store/index.js
export const actions = {
  async GET_STARS({ commit }) {
     const { data } = await axios,get('http://my-api/stars')
     commit('SET_STARA', data)
  }
}

asyncData此方法在加载(渲染)组件(页面组件,即pages文件夹下的文件,不包含components下的)之前在服务端或路由更新之前被调用,即可以进行异步获取数据并返回当前组件。

第一个参数为当前页面的上下文

 export default {
    data () {
      return {
         project: 'default'
      }
    },
    asyncData(context) {
        // asyncData方法是在组件初始化前被调用的
       //所以该方法没有办法通过this来引用组件的实例对象
    }
 }