学习项目-前端-第九课:NUXT
一、preparation
1、prerequisites:node - at least v8.9.0(latest version is recommended)
2、download starter-template-master
3、command line-->cnpm install
4、change "{{ name }}"(package.json) to your project name
5、command line-->npm run dev
6、change title(nuxt.config.js-->head-->title)
二、layout/default.vue
1 <template> 2 <div> 3 <header>tensquare Social Plateform
4 <nuxt/><!-- /pages/index.vue --> 5 <footer>Predator Copyright</footer> 6 </div> 7 </template> 8 </script>
三、page route(automatic search by directory architecture)
四、render
1、install axios-->command line:cnpm install axios --save
2、pages/gathering/index.vue(single)
1 <template> 2 <div> 3 Activity List 4 <div v-for="(item,index) in items" :key="index">{{item.name}}</div>
<!--
--> <!-- 按","拆分进行循环 -->
5 </div> 6 </template> 7 <script> 8 import axios from 'axios' 9 export default { 10 asyncData(){ 11 return axios.get('http://192.168.1.66:7300/mock/5f01a8f3b2b4ff07dd0ca4fc/api/gathering').then( 12 res=>{ 13 console.log(res.data.data) 14 return {items: res.data.data} 15 }); 16 } 17 } 18 </script>
3、pages/recruit/index.vue(multiple)
1 <script> 2 import '~/assets/css/page-sj-recruit-index.css' 3 import recruitApi from '@/api/recruit' 4 import enterpriseApi from '@/api/enterprise' 5 import axios from 'axios' 6 export default { 7 asyncData(){ 8 return axios.all([recruitApi.recommend(), recruitApi.newlist(),enterpriseApi.hotlist() ]).then( 9 axios.spread( function( recommendList,newList ,hostList ){ 10 return { 11 recommendList: recommendList.data.data, 12 newList: newList.data.data, 13 hostList: hostList.data.data 14 } 15 }) 16 ) 17 } 18 } 19 </script>
4、pages/recruit/_id.vue(embedded called)
<script> import '~/assets/css/page-sj-recruit-detail.css' import recruitApi from '@/api/recruit' import enterpriseApi from '@/api/enterprise' export default { asyncData({params}){ return recruitApi.findById(params.id ).then( res =>{ return enterpriseApi.findById( res.data.data.eid ).then( res2=>{ return { enterprise_item: res2.data.data, item:res.data.data } } ) }) } } </script>
五、dynamic route
六、link static resource("~")
七、<router-link/>
1 <ul class="sui-nav"> 2 <router-link tag="li" to="/" active-class="active" exact><a>首页</a></router-link> 3 <router-link tag="li" to="/qa" active-class="active"><a>问答</a></router-link> 4 <router-link tag="li" to="/gathering" active-class="active"><a>活动</a></router-link> 5 <router-link tag="li" to="/friend" active-class="active"><a>交友</a></router-link> 6 <router-link tag="li" to="/spit" active-class="active"><a>吐槽</a></router-link> 7 <router-link tag="li" to="/recruit" active-class="active"><a>招聘</a></router-link> 8 </ul>
1、tag="li"--><li></li>
2、active-class="active"
3、exact-->precise to the link
八、waterfall flow component(vue-infinite-scroll)
1、install-->command line:cnpm install vue-infinite-scroll --save
2、configured in plugins/vue-infinite-scroll.js
1 import Vue from 'vue' 2 import infiniteScroll from 'vue-infinite-scroll' 3 Vue.use(infiniteScroll)
3、configured in nuxt.config.js
1 head: { 2 title: 'predator', 3 meta: [ 4 { charset: 'utf-8' }, 5 { name: 'viewport', content: 'width=device-width, initial-scale=1' }, 6 { hid: 'description', name: 'description', content: '{{escape description }}' } 7 ], 8 link: [ 9 { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' } 10 ] 11 },
CSS:("starter-template-master/node_modules/element-ui/lib/theme-chalk/index.css")
4、use(pages/gathering/index.vue)
1 <template> 2 <div class="wrapper activities"> 3 <div class="activity-card-list"> 4 <div class="top-title"> 5 <h4 class="latest">最新活动</h4> 6 <div class="clearfix"></div> 7 </div> 8 <div class="activity-list" v-infinite-scroll="loadMore"> 9 <ul class="activity"> 10 <li class="activity-item" v-for="(item,index) in items" :key="index"> 11 <div class="activity-inner"> 12 <a href="http://"></a> 13 <div class="img"> 14 <a :href="'/gathering/item/'+item.id" target="_blank"><img :src="item.image" alt="" /></a> 15 </div> 16 <div class="text"> 17 <p class="title">{{item.name}}</p> 18 <div class="fl goin"> 19 <p>时间:{{item.starttime}}</p> 20 <p>城市:{{item.city}}</p> 21 </div> 22 <div class="fr btn"> 23 <span class="sui-btn btn-bao">立即报名</span> 24 </div> 25 <div class="clearfix"></div> 26 </div> 27 </div> </li> 28 29 </ul> 30 </div> 31 </div> 32 </div> 33 </template> 34 <script> 35 import '~/assets/css/page-sj-activity-index.css' 36 import gatheringApi from '~/api/gathering' 37 38 export default { 39 data(){ 40 return { 41 pageNo: 1 42 } 43 }, 44 asyncData(){ 45 return gatheringApi.search(1,12,{state: '1'}).then(res => { 46 return {items: res.data.data.rows} 47 }) 48 }, 49 methods: { 50 loadMore(){ 51 this.pageNo++ 52 gatheringApi.search(this.pageNo,12,{state: '1'}).then(res => { 53 this.items = this.items.concat(res.data.data.rows); 54 }); 55 } 56 } 57 } 58 </script>
九、Share.js
1、use javascript and css
1 export default { 2 asyncData( {params} ){ 3 return gatheringApi.findById(params.id).then(res=>{ 4 return {item: res.data.data} 5 }) 6 }, 7 head: { 8 script: [ 9 {src: 'https://cdn.bootcss.com/social-share.js/1.0.16/js/social-share.min.js'} 10 ], 11 link: [ 12 {rel: 'stylesheet',href: 'https://cdn.bootcss.com/social-share.js/1.0.16/css/share.min.css'} 13 ] 14 } 15 }
2、usage
3、options
十、js-cookie(save user information at front end)
1、install-->command line:cnpm install js-cookie --save
2、create utils/auth.js
1 import Cookies from 'js-cookie' 2 3 const TokenKey = 'User-Token' 4 const NameKey = 'User-Name' 5 const AvatarKey = 'User-Avatar' 6 7 export default { 8 setUser(token,name,avatar){ 9 Cookies.set(TokenKey,token), 10 Cookies.set(NameKey,name), 11 Cookies,set(AvatarKey,avatar) 12 } 13 }
3、use(login.vue)
1 <script> 2 import '~/assets/css/page-sj-person-loginsign.css' 3 import userApi from '@/api/user' 4 import Auth from '@/utils/auth' 5 export default { 6 data(){ 7 return { 8 pojo: {}, 9 code: '', 10 mobile: '', 11 password: '' 12 } 13 }, 14 methods: { 15 sendsms(){ 16 userApi.sendsms(this.pojo.mobile).then(res=>{ 17 this.$message({ 18 message: res.data.message, 19 type: (res.data.flag?'success':'error') 20 }) 21 }) 22 }, 23 register(){ 24 userApi.register(this.pojo,this.code).then(res=>{ 25 this.$message({ 26 message: res.data.message, 27 type: (res.data.flag?'success':'error') 28 }) 29 }) 30 }, 31 login(){ 32 userApi.login(this.mobile,this.password).then(res=>{ 33 if(res.data.flag){ 34 Auth.setUser(res.data.data.token,res.data.data.name,res.data.data.avatar); 35 location.href = '/manager' 36 } else { 37 this.$message({ 38 message: res.data.message, 39 type:'error' 40 }) 41 this.mobile = '', 42 this.password = '' 43 } 44 }) 45 } 46 } 47 } 48 </script>