[Nuxt.js]Nuxt.js基础

Nuxt.js支持:在这里插入图片描述
Nuxt.js工作流:

在这里插入图片描述

Nuxt.js安装:
vue init nuxt-community/koa-template 项目名

这个是集成了koa-tempalte的nuxt.js
在这里插入图片描述
在这里插入图片描述
也可以这么安装(nuxt2.0官方的脚手架):
先全局安装npx

npm install -g npx

再执行命令

npx create-nuxt-app project-name

注意要指定版本为2.0.0,否则可能没有server framework选项
在这里插入图片描述

安装好后执行:

npm run dev

如果有报错参考:
1.https://blog.csdn.net/weixin_42614080/article/details/105613214
2.https://blog.csdn.net/qq_40571631/article/details/103285331
成功启动则如下所示:
在这里插入图片描述
访问localhost:3000看到如下即表示成功
在这里插入图片描述

Nuxt.js目录

在这里插入图片描述

安装好的Nuxt.js不会一开始就有store目录,需要我们自己创建,一旦创建了store目录,Nuxt.js就会自动为我们配置vuex,非常的方便,“创建即配置”
当我们在pages中创建了一个页面,比如search.vue
在这里插入图片描述

<template>
  <section class="container">
    <img src="../assets/img/logo.png" alt="Nuxt.js Logo" class="logo" />
    <h1 class="title">
      Search.Vue
    </h1>
  </section>
</template>

<style scoped>
.title
{
  margin: 50px 0;
}
</style>

此时我们去浏览器访问localhost:3000/search即可访问到这个页面,nuxt.js自动配置了和文件名一致的路由,“创建即配置”
在这里插入图片描述
但是我们发现,每个页面底下都有一部分(图示红框标出的部分)并不是我们在对应的页面文件中编写的内容,这一部分其实是写在layouts目录下的
在这里插入图片描述
default.vue是在你没有配置声明layout模板的时候所有页面都默认用default.vue作为模板,当然模板中也可以引入组件
在这里插入图片描述
在这里插入图片描述
顺便一提,这个<nuxt/>组件也就相当于原版vue中的<router-view/>(如果要调用组件必须要加入这个组件,这个标签表示路由匹配到的组件显示的位置),那么还有<nuxt-link/>组件,也相当于<router-link/>


<template>
	<div class="navbar">
		<ul id="main">
			<li><router-link  to="/food" >商品</router-link></li>
			<li><router-link  to="/rating">评价</router-link></li>
			<li><router-link  to="/seller">商家</router-link></li>
		</ul>
<router-view></router-view>  <!-- 路由匹配到的组件将显示在这里 -->
	</div>
</template>

那么接下来我们自己来写一些layout模板,就以search.vue为例
1.在layouts目录下新建search.vue

<template>
    <div class="layout-search">
        <h1>search layout header</h1>
        <nuxt/>
        <footer>search layout footer</footer>
    </div>
</template>

<script>
export default {
    
}
</script>

<style lang="css" scoped>
    .layout-search{
        color:red;
        }
</style>

2.在pages目录下的search.vue中声明

export default {
    layout:"search"
}

3.刷新页面
在这里插入图片描述
可以看到现在用的是我们自己编写的layout模板layouts/search.vue

Nuxt.js配置

打开nuxt.config.js
在这里插入图片描述
1.title: ‘starter’,
这个表示页面的标题,我们把它改为title: ‘Jayee’,
保存后会自动开始编译
在这里插入图片描述
编译完成后刷新页面
在这里插入图片描述
在这里插入图片描述
标签页的标题已经从starter变为了Jayee
2. meta:
配置字符等等…
4. css: [’~assets/css/main.css’],
这个表示配置全局的css,我们上面的/l;ayouts/search.vue虽然没有引用main.css,但是footer标签仍然居中了(我的截图不完整,可能看不出来居中的效果,可以查看网页源代码看到确实有给footer加一个居中的样式),这个自动居中是写在main.css中的,就是因为这里配置了全局css,所以自动引入了main.css,所以footer标签居中了
5. loading:
用于配置加载圈的样式
6. build:
关于eslint的一些配置
更多的配置参考:https://nuxtjs.org/api (不要去看中文文档,中文文档的版本太低了)

Nuxt.js异步数据&示例&SSR剖析

1.首先我们在server目录下创建一个接口的目录/interface在这里插入图片描述
然后创建一个接口文件,比如叫city.js

import Router from 'koa-router' // 引入koa的路由
const router = new Router({
    prefix:'/city'  // 接口前缀
})
router.get('/list', async (ctx)=>{
    ctx.body = ["上海","长沙"]
})
export default router

2.既然引用了koa-router,我们当然要安装

npm i koa-router

3.然后在/server/index.js中引用这个接口
在这里插入图片描述

import cityInterface from './interface/city'
app.use(cityInterface.routes()).use(cityInterface.allowedMethods())
//这是固定的写法

4.我们来测试一下这个接口
curl http://localhost:3000/city/list
在这里插入图片描述
可以看到数据返回成功,说明接口没问题
5.现在我们来用浏览器端发请求(通过axios),接下来以之前写的search页面为例
安装axios

npm install axios

修改seach.vue

在这里插入图片描述

 let {status,data:{list}}= await axios.get('/city/list')
 //这是一个解构赋值,axios请求返回的结构与我们定义的变量结构相同

修改接口city.js在这里插入图片描述
6.现在可以看到已经成功请求并且将数据渲染到了页面
在这里插入图片描述
此时我们查看源代码:
在这里插入图片描述
可以看到服务器下发的源文件中并没有上海和长沙这两个数据,说明他们是浏览器渲染的
7.在nuxt.js中,我们用asyncData这个函数来进行异步数据请求的操作
在asyncData执行的时候是没有app实例的(上面那种在mounted中写的方法是有的),所以这里我们不能写this,而是通过直接靠return返回的方式:
在这里插入图片描述

注意,这种方法默认的端口是80端口,而我们这里用的是3000端口(koa),所以要写全接口地址
此时我们打开网页源代码:
在这里插入图片描述
可以看到服务器下发的源文件就已经有上海、长沙两个数据,并且和模板整合完了
也就是说这种方法服务器端把编译好的内容下发给浏览器,同时也把异步获取的数据给浏览器端
这就是服务器端渲染(SSR)
8.用fetch请求异步数据
在Nuxt.js工作流的那张图中可以看到,除了用asyncData还可以用fetch来请求异步数据
在这里插入图片描述

asyncData用于处理组件的数据,fetch用来处理Vuex的数据(提交Vuex状态)如果把第七步的asyncData改成fetch,是无法请求到数据也无法渲染的

Vuex应用&示例

在这里插入图片描述
“创建即配置”
1.在根目录下创建store目录,然后如下图创建文件
在这里插入图片描述

//city.js
const state = () => ({
  cityList: ['长沙','北京'] //城市列表
})

const mutations = {
  add(state, text) {
    state.cityList.push(text) 
  }
}

const actions = {
  add: ({commit}, text) => {
    commit('add', text)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

//navbar.js
const state = () => ({
    navList: [] //navbar列表
  })
  
  const mutations = {
    add(state, text) {
      state.navList.push(text) 
    }
  }
  
  const actions = {
    add: ({commit}, text) => {
      commit('add', text)
    }
  }
  
  export default {
    namespaced: true,
    state,
    mutations,
    actions
  }
  
//index.js
import Vue from 'vue'
import Vuex from 'vuex'
import city from './modules/city'
import navbar from './modules/navbar'

Vue.use(Vuex)

const store=()=> new Vuex.Store({
    modules:{
        city,
        navbar
    },
    actions:{

    }
})

export default store

2.将search.js中改为取store中的值
在这里插入图片描述
3.刷新页面
如果报错 Error in render: "TypeError: Cannot read property 'state' of undefined"npm run dev重新启动
在这里插入图片描述
可以看到页面显示了我们在cityList中定义的数据
查看源代码也可以看到
在这里插入图片描述
说明这也是服务器端渲染(SSR)
4.我们在index.js的actions中可以写入nuxtServerInit方法,这个方法表示在我们请求的时候,服务器端会写入一些数据到浏览器端的vuex中(正常情况当然不应该放到city的state中,只是这里我们没有建立user.js,为了演示方便用了city代替)
在这里插入图片描述
这么做的好处是什么呢?比如某个用户访问了我们网站的首页,一般来讲浏览器应该要另外发起一次请求去服务端获取用户信息回到浏览器端,而这个方法则让用户访问首页的时候服务器端就自动返回用户的信息,省去了我们单独再做一次请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值