nuxt搭建和配置多页架构

模块:nuxt、vue、vue-router、vuex、elementUI、Font Awesome、Animate.css、axios
实践新语法:async-await

例子代码基础架构和配置

总结

说说,搭建一个架构需要做的基础事项,剩下的就是堆积代码和组件
搭建架构新体会:🤔

记得之前在一灯

Build Setup

# install dependencies
$ npm install # Or yarn install

# serve with hot reload at localhost:3000
$ npm run dev

# build for production and launch server
$ npm run build
$ npm start

# generate static project
$ npm run generate

集成内容

网页z-index即堆叠层级说明

elementUI继承

import Vue from 'vue'
import Element from 'element-ui'
Vue.use(Element);
build: {
  // add
  vendor: ['element-ui'],
},
css: [
// add
  {src:'element-ui/lib/theme-chalk/index.css'},
],
plugins: [{src:'~plugins/element-ui', ssr: true}],

nuxt中vue-router

使用方法还是一样的没有变化
例子:

html导航

<nuxt-link to="/test">test</nuxt-link>

js导航

this.$router.push({
  path:'/user',
  query:{
    age:18
  }
})

路由传参

注意:这种方法不能被seo到
而且当刷新页面的时候,相关数据会被清空

定义

<nuxt-link :to="{name:'login',params:{userId:'signin'}}"><div class="nav_item sign_item">登录</div></nuxt-link>

使用

<h1>{{$route.params.userId}}</h1>

请求数据

module.exports = {
    modules: [
        '@nuxtjs/axios',
        '@nuxtjs/proxy',
    ],
    proxy: {
        '/api': {
            target: 'http://api.douban.com',
            pathRewrite: { '^/api/': '' }
        }
    }

}

组件局部引用和使用方法(全局使用请看下面全局配置)

引入

import axios from 'axios'

使用

methods:{
  async requestData(){
    const url = 'http://api.douban.com/v2/movie/top250?start=1&count=10';
    let { data } = await axios.get('api/v2/movie/top250?start=1&count=10')
    console.log(data)
    return { users: data.data }
  },
},

更改域名和端口

"config":{
  "nuxt":{
    "post":"0.0.0.0",
    "port":"3002"
  }
},

开发代理域名配置

Vuex的理解

组件和组件之间的传值管理,即状态管理模式

两种使用方式

第一种分页面管理状态

state/index.js文件

定义

export const state=()=>({
    amount:0
})

export const mutations={
    add(state){
        state.amount++;
    }
}

使用

// 变量
{{$store.state.amount}}

// 方法
@click="$store.commit('add')"

state/test.js文件

定义

export const state=()=>({
    amount:100
})

export const mutations={
    add(state){
        state.amount++;
    }
}

使用

// 变量
{{$store.state.test.amount}}

// 方法
@click="$store.commit('test/add')"

第二种整个网站公用一个状态index.js文件

// import Vue from 'vue'
// import Vuex from 'vuex'

// Vue.use(Vuex)

// const store = ()=>new Vuex.Store({
//  state:{
//      amount:0,
//  },
//  mutations:{
//      add(state){
//          state.amount++;
//      }
//  }
// })

使用Vuex来处理表单问题

当使用Vuex的时候,处理表单就变得不那么简单了

全局方法属性等配置

import Vue from 'vue'
import axios from 'axios'

const data = {
    install(Vue){
        Vue.prototype.$axios = axios;
    }
};

Vue.use(data)
plugins: [
    {src:'~plugins/element-ui', ssr: true},
    {src:'~plugins/address',ssr:false},
    {src:'~plugins/axios',ssr:false},
  ],

使用

console.log(this.$axios)

post and get

post

async onPhoneRepeat(mobile) {
  const {env,checkUserName}=this.$addr;
  const params = {
    loginName: mobile
  };
  return await this.$requestPost(this,`${env}${checkUserName}`,params);
},

错误集合

前后台结构不一致

错误内容

[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside<p>, or missing <tbody>. Bailing hydration and performing full client-side render.

解决办法

plugins: [{src:'~plugins/element-ui', ssr: true}],

使用router中params传参出现刷新页面,相关参数被清空的问题

定义

<nuxt-link :to="{name:'login',query:{userId:'signin'}}"><div class="nav_item sign_item">登录</div></nuxt-link>

使用

<h1>{{$route.query.userId}}</h1>

vuex.esm.js:383 [vuex] unknown mutation type: updatePhone