NPM安装 npm install vue 面试官问,如何创建Vue项目? 达达写下代码:" />

飞道的博客

【前端大神面考面试官系列】入门Vue全家桶

412人阅读  评论(0)

(给达达前端加星标,提升前端技能

面试官问:Vue如何安装的呢?

达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装。

CDN引入

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

NPM安装

npm install vue

面试官问,如何创建Vue项目?

达达写下代码:

创建项目


   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门之Helloworld </title>
  6. <!--引入Vue库-->
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> </script>
  8. </head>
  9. <body>
  10. <!--创建一个Div-->
  11. <div id="app">
  12. <!--Vue的模板的绑定数据的方法,用两对花括号进行绑定Vue中的数据对象的属性 -->
  13. {{message}}
  14. </div>
  15. <!--创建Vue的对象,并把数据绑定到上面创建好的div上去。-->
  16. <script type="text/javascript">
  17. var app= new Vue({ // 创建Vue对象。Vue的核心对象。
  18. el: '#app', // el属性:把当前Vue对象挂载到 div标签上,#app是id选择器
  19. data:{ // data: 是Vue对象中绑定的数据
  20. message: 'hello Vue!' // message 自定义的数据
  21. }
  22. })
  23. </script>
  24. </body>
  25. </html>

输出的结果:

hello Vue!

面试官问:v-if和v-show的区别是?

达达回答:

内部指令

v-if用于显示与隐藏的元素

<div v-if="isShow">达达前端</div>

v-else,v-if不是它,就是它v-else

<div v-else>达达前端</div>

v-show

<div v-show="isShow">你好</div>

v-else-if


   
  1. <div v-if="type === 'A'">A </div>
  2. <div v-else-if="type === 'B'">B </div>
  3. <div v-else-if="type === 'C'">C </div>
  4. <div v-else>Not A/B/C </div>

v-if和v-show的区别是:

v-if用于元素的被销毁和重建,使用这个指令开销较为高,在运行过程中,尽量用在很少改变时的情况下使用。v-if元素销毁和存在

v-show的用法,这个指令的使用开销较小,在常频繁地切换使用

面试官问:内部指令的用法有哪些,怎么用呢?

达达回答:好,慢慢讲述。

v-for的用法


   
  1. <!-- 模板 -->
  2. <div id="app">
  3. <ul>
  4. <li v-for="item in items">
  5. {{item}}
  6. </li>
  7. </ul>
  8. </div>
  9. <!--JS代码 -->
  10. <script type="text/javascript">
  11. var app= new Vue({
  12. el: '#app',
  13. data:{
  14.              items:[ 1234]
  15. }
  16. })
  17. </script>

对象遍历


   
  1. <!-- 模板 -->
  2. <div id="app">
  3. <ul>
  4. <li v-for="(value, key, index) in object">
  5. {{ index }}. {{ key }} - {{ value }}
  6. </li>
  7. </ul>
  8. </div>
  9. <!--JS代码 -->
  10. <script type="text/javascript">
  11. var app= new Vue({
  12. el: '#app',
  13. data:{
  14. object: {
  15. firstName: 'dada',
  16.                  lastName'qianduan'
  17. }
  18. }
  19. })
  20. </script>

v-text的出现为了解决{{xx}}这个取值的问题,当网络很慢的情况下,或者是运行时出错的情况下,页面显示为{{xxx}}。


   
  1. <div>{{ message }} </div>
  2. <!-- 一样的 -->
  3. <div v-text="message"> </div>

v-html指令是用于输出html代码

<span v-html="msgHtml"></span>

v-on的用法


   
  1. // html
  2. <div>{{count}}</div>
  3. <button v- on:click= "add">加</button>
  4. // JS
  5. data:{
  6. count: 1
  7. },
  8. methods: {
  9. add() {
  10. this.count++;
  11. }
  12. }

缩写

<button @click="add">加</button>

v-model的用法,model都需要在data中声明初始值:


   
  1. data: {
  2.      count1,
  3. }

input的用法

<input type="text" v-model="message">

textarea

<textarea  cols="30" rows="10" v-model="message"></textarea>

checkbox


   
  1. <input type="checkbox" id="first" value="1" v-model="status">
  2. <label for="first">有效 </label>
  3. <input type="checkbox" id="second" value="2" v-model="status">
  4. <label for="second">无效 </label>
  5. <div>状态:{{status}} </div>

radio


   
  1. <input type="radio" id="one" value="男" v-model="sex">
  2. <label for="one"></label>
  3. <input type="radio" id="two" value="女" v-model="sex">
  4. <label for="one"></label>
  5. <div>性别:{{sex}} </div>

select


   
  1. <select v-model="selected">
  2. <option disabled value="">请选择 </option>
  3. <option>A </option>
  4. <option>B </option>
  5. <option>C </option>
  6. </select>
  7. <div>Selected: {{ selected }} </div>

v-bind方法


   
  1. // html
  2. <img v-bind:src= "imgSrc" width= "200px">
  3. // js
  4. data: {
  5.     imgSrc: ''
  6. }

缩写

<img :src="imgSrc"  width="200px">

v-pre方法,用这个指令可以直接跳过vue的编译,直接输出原始值,如果在标签中加入v-pre就不会输出vue中的data值。

<div v-pre>{{message}}</div>

v-cloak可以在vue渲染时指定的整个dom后才进行显示,必须和css样式一起用


   
  1. // css
  2. [ v-cloak] {
  3. display: none;
  4. }
  5. // html
  6. <div v-cloak>{{message}}</div>

v-once只能显示一次,第一次渲染的值就不会改变了

<div v-once>{{message}}</div>

面试官问:你知道Vue生命周期吗?

达达回答:

new Vue() 实例化对象,init events & lifecycle 初始化,事件和生命周期

beforeCreate组件实例刚被创建,还没有实例化之前,执行一些初始化的操作,可以制作加载动画

init injections & reactivity 初始化,依赖注入和校验

created组件实例创建完成,属性已经绑定,但是dom还没有生成,$el属性还不存在,页面未被展示,结束加载动画,发起异步网络请求

has"el" option? no 判断是否存在el属性,如果有,则继续编译,如果没有,则停止编译,生命周期结束,知道在该vue实例上调用vm.$mount(el),即被唤醒继续执行编译,如果注释掉“el”,等程序到create就停止了

判断是否有template,如果有,则将其编译成render函数,如果没有,则将外部的HTML作为模板编译,template中的模板优先级高于outer html 的优先级。

yes的路线,compile template into render function

如果tremplate中组件的话,执行render方法渲染组件内容

compile el's outerhtml as template

beforeMount,完成虚拟dom配置,模板已经被编译,把data里面的数据和模板生成html,此时还没有挂载html到页面上

create vm.$el and replace "el" with it,给vue实例对象添加$el成员,并且替换掉挂载的dom元素

mounted,用上面编译好的html内容替换el属性指向dom对象,方法结束后,dom结构完成,页面显示出来,发起网络请求

Mounted,when data changes,beforeUpdate,当vue发现data中的数据发生了改变,会触发对应组件的重新渲染,一般在组件发生更新之前,调用这个函数,页面还不会展示修改的内容,但虚拟dom已经配置修改

virtual dom re-render and patch,重新渲染虚拟dom并通过diff算法对比vonde节点差异更新真实dom,updated,组件更新后,此方法执行后,修改后的页面展现出来,即为view重新渲染,数据更新

when wm.$destroy() is called,beforeDestroy,组件实例销毁前调用,实例仍然完全可用

teardown watchers, child components and event listeners 拆卸观察者,子组件,事件监听者

destroyed,在vue实例销毁后调用,实例指示的所有东西都会被解除绑定,所有的事件监听都会被移除,所有的子实例都会被销毁

面试官问:在vue中常用的语句有哪些

达达回答:好的,请认真听讲

computed计算属性,用于对原数据进行修改


   
  1. computed: {
  2. newPrice () {
  3. return '¥' + this.price + '元';
  4. }
  5. }

methods方法属性,用于绑定方法


   
  1. methods:{
  2. add (num) {
  3. this.count += num;
  4. }
  5. }

watch数据变化监听器


   
  1. watch: {
  2. question( val, oldVal) {
  3. console.log( 'new: %s, old: %s', val, oldVal);
  4. }
  5. }

filters 过滤器


   
  1. filters: {
  2. filterA( value) {
  3. return value.toUpperCase();
  4. }
  5. }

mixins用于减少代码污染,减少代码量,实现代码重用


   
  1. var addLog={
  2. updated: function(){
  3. console.log( "数据放生变化,变化成"+ this.count+ ".");
  4. }
  5. }
  6. var app =  new Vue({
  7.      el: '#app',
  8. data:{
  9. count: 100
  10. },
  11. // 混入
  12. mixins: [addLog]
  13. })

extends用于扩展,对构造器进行扩展


   
  1. var extendObj ={
  2. created: function(){
  3.          console.log( "我是");
  4. }
  5. }
  6. var app =  new Vue({
  7.      el: '#app',
  8. data:{
  9. },
  10. // 扩展
  11. extends: extendObj
  12. })

面试官问,你知道哪些实例事件吗?

达达回答,vue有实例属性,实例方法,实例事件


   
  1. $on接收两个参数,第一个参数是调用时的事件名称,第二个参数是一个匿名方法
  2. app. $on( 'reduce', function(){
  3. console.log( '执行了reduce()');
  4. this.count--;
  5. });
  6. app. $once( 'reduceOnce', function(){
  7. console.log( '只执行一次的方法');
  8. this.count--;
  9. });
  10. function off(){
  11. console.log( '关闭事件');
  12. app. $off( 'reduce');
  13. }
  14. function reduce() {
  15. // 事件调用
  16. console.log( 'emit事件调用');
  17. app. $emit( 'reduce');
  18. }

面试官问:你知道自定义指令吗

达达回答:知道吧


   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门之自定义指令 </title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> </script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-test="color">
  11. {{num}}
  12. </div>
  13. </div>
  14. <button οnclick="unbindApp()">解绑 </button>
  15. <script type="text/javascript">
  16. function unbindApp() {
  17. app.$destroy();
  18. }
  19. // 自定义指令
  20. Vue.directive( "test",{
  21.      //被绑定
  22. bind: function (el, binding, vnode) {
  23. console.log( "1-bind 被绑定");
  24. console.log( "el:",el);
  25. console.log( "binding:",binding);
  26. console.log( "vnode:",vnode);
  27. el.style.color = binding.value;
  28. },
  29.      //被插入
  30. inserted: function (el, binding, vnode) {
  31. console.log( "2-inserted 被插入");
  32. },
  33.      //更新
  34. update: function (el, binding, vnode) {
  35. console.log( "3-update 更新");
  36. },
  37.      //更新完成
  38. componentUpdated: function (el, binding, vnode) {
  39. console.log( "4-componentUpdated 更新完成");
  40. },
  41.      //解绑
  42. unbind: function (el, binding, vnode) {
  43. console.log( "5-unbind 解绑");
  44. }
  45. });
  46. var app = new Vue({
  47. el: '#app',
  48. data:{
  49. num: 123,
  50. color: 'red'
  51. }
  52. })
  53. </script>
  54. </body>
  55. </html>

面试官问:你用过组件吗?

达达回答,用过的

组件全局注册


   
  1. Vue.component( 'button-counter', {
  2. data: function () {
  3. return {
  4. count: 0
  5. }
  6. },
  7.      template'<button v-on:click="count++">全局组件: {{ count }}</button>'
  8. });
  9. new Vue({
  10. el: '#app'
  11. });
  12. <button-counter></button-counter>

组件局部注册


   
  1. new Vue({
  2. el: '#app',
  3. components:{
  4. "button-inner":{
  5. data: function() {
  6. return {
  7. inner: 0
  8. }
  9. },
  10.              template'<button v-on:click="inner++">局部组件: {{ inner }}</button>'
  11. }
  12. }
  13. });
  14. <button-inner></button-inner>

props属性传值


   
  1. new Vue({
  2. el: '#app',
  3. components:{
  4. "button-props":{
  5. template: `
  6. <div style="color:red;">
  7. 参数1: {{ da }}:---参数2:
  8. {{fromHere}}
  9. </div>
  10. `,
  11. props:[ 'da', 'fromHere']
  12. }
  13. }
  14. });
  15. // html使用
  16. <button-props da= "da" from-here= "world"> </button-props>
  17. props中需要驼峰取值

父子组件


   
  1. // 子组件
  2. var city = {
  3. template:`<div>dada</div>`
  4. }
  5. // 父组件
  6. var parent = {
  7. template:
  8. `<div>
  9. <p> dadada!</p>
  10. <city></city>
  11. </div>`,
  12. components:{
  13. "city": city
  14. }
  15. }
  16. // 实例化
  17. new Vue({
  18. el: '#app',
  19. // 定义局部组件
  20. components:{
  21. // 组件注册
  22. "parent": parent
  23. }
  24. });
  25. // html使用
  26. < parent></ parent>

面试官:你了解模板吗?

达达回答:还好


   
  1. <div id="app">
  2. </div>
  3. <script type="text/javascript">
  4. // 实例化
  5. new Vue({
  6. el: '#app',
  7. data: {
  8. message: 'hello'
  9. },
  10.          template: `<h1 style="color:red">模板</h1>`
  11. });
  12. </script>

   
  1. <div id="app">
  2. <template id="demo2">
  3.          <h2 style="color:red">template模板 </h2>
  4. </template>
  5. </div>
  6. <script type="text/javascript">
  7. // 实例化
  8. new Vue({
  9. el: '#app',
  10. data: {
  11. message: 'hello'
  12. },
  13. template: '#demo2'
  14. });
  15. </script>

   
  1. <div id="app">
  2. </div>
  3. <script type="x-template" id="demo3">
  4.      <h2 style="color:red">script标签模板 </h2>
  5. </script>
  6. <script type="text/javascript">
  7. // 实例化
  8. new Vue({
  9. el: '#app',
  10. data: {
  11. message: 'hello'
  12. },
  13. template: '#demo3'
  14. });
  15. </script>

面试问:你了解插槽不?

达达回答:插槽就是slot,是组件的一块Hmtl模板


   
  1. <div id="app">
  2.      <children>
  3.          <span>123 </span>
  4.      </children>
  5. </div>
  6. <script type="text/javascript">
  7. var app = new Vue({
  8. el: '#app',
  9. components: {
  10.              children: {
  11. template: "<button><slot></slot>单个插槽</button>"
  12. }
  13. }
  14. });
  15. </script>

具名插槽slot,具名插槽可以在一个组件中出现n次


   
  1. <div id="app">
  2.      <children>
  3.          <span slot="first" @click="toknow">123 </span>
  4.          <span slot="second">456 </span>
  5.      </children>
  6. </div>
  7. <script type="text/javascript">
  8. var app = new Vue({
  9. el: '#app',
  10. methods: {
  11.             toknow: function () {
  12. console.log("dada");
  13. }
  14. },
  15. components: {
  16.             children: {
  17. template: " <button>
  18. <slot name='first'>
  19. </slot>
  20.                 具名插槽
  21. <slot name='second'>
  22. </slot>
  23. </button>"
  24. }
  25. }
  26. });
  27. </script>

作用域插槽slot


   
  1. <div id="app">
  2. <!-- 将数据传递给组件 -->
  3.      <tb-list :data="data">
  4. <template slot-scope="scope">
  5. <p>索引:{{JSON.stringify(scope)}} </p>
  6. <p>索引:{{scope.$index}} </p>
  7. <p>姓名:{{scope.row.name}} </p>
  8. <p>年龄: {{scope.row.age}} </p>
  9. <p>性别: {{scope.row.sex}} </p>
  10. </template>
  11. </tb-list>
  12. </div>
  13. <script type="text/javascript">
  14. var app = new Vue({
  15. el: '#app',
  16. data: {
  17. data: [{
  18. name: 'dada',
  19.                  age'12',
  20. sex: 'man'
  21. }]
  22. },
  23. components: {
  24. // 作用域slot
  25. 'tb-list': {
  26. template:
  27. `<ul>
  28. <li v-for="(item, index) in data">
  29. <slot :row="item" :$index="index">
  30. </slot>
  31. </li>
  32. </ul>`,
  33. // 获取值
  34. props: [ 'data']
  35. }
  36. }
  37. });
  38. </script>

面试官问:你用过vue-cli吗?说一说

达达回答:好的

vue-cli安装,第一用npm安装

npm -v

vue-cli安装

npm install vue-cli -g

   
  1. vue -V
  2. -g代表全局安装,然后查看版本

初始化项目


   
  1. 用vue init命令来初始化项目
  2. vue  init <template-name> <project-name>
  3. init:表示要用vue-cli来初始化项目
  4. <template-name>:表示模板名称
  5. vue-cli官方提供的 5种模板
  6. webpack
  7. webpack-simple
  8. browserify
  9. browserify-simple
  10. simple
  11. <project-name>:标识项目名称,用户根据自己的项目来起名字。

项目初始化

vue init webpack my-vue-demo

   
  1. Project name:项目名称
  2. Project description:项目描述
  3. Author:作者
  4. Install vue-router? 是否安装vue的路由插件,需要安装,选择Y
  5. Use ESLint to lint your code? 是否用ESLint来限制你的代码错误和风格。不需要输入n,需要选择y
  6. setup unit tests with Karma + Mocha? 是否需要安装单元测试工具
  7. Setup e2e tests with Nightwatch? 是否安装e2e来进行用户行为模拟测试

运行项目


   
  1. npm run dev
  2. npm run build

面试官问:你了解vue-router吗?说一说

达达回答,嗯,了解。

安装

npm install vue-router --save

核心文件


   
  1. import Vue  from  'vue'
  2. import Router  from  'vue-router'
  3. import HelloWorld from '@/components/HelloWorld'
  4. // Vue全局使用Router
  5. Vue.use(Router)
  6. export default new Router({
  7. routes: [ //配置路由,这里是个数组
  8. { //每一个链接都是一个对象
  9. path: '/', //链接路径
  10. name: 'HelloWorld', //路由名称,
  11. component: HelloWorld //对应的组件模板
  12. }
  13. ]
  14. })

使用


   
  1. import Vue  from  'vue'
  2. import App  from  './App'
  3. import router  from  './router'
  4. Vue.config.productionTip = false
  5. new Vue({
  6. el: '#app',
  7. router, // 注入框架中
  8. components: { App },
  9. template: '<App/>'
  10. })

页面跳转


   
  1. <router-link to="/">[显示字段] </router-link>
  2. <p>导航 :
  3. <router-link to="/">首页 </router-link>
  4. <router-link to="/hello">hello </router-link>
  5. </p>

编程式导航


   
  1. this.$router.push( '/xxx')
  2. <button @click= "goHome">回到首页</button>
  3. export default {
  4. name: 'app',
  5. methods: {
  6. goHome(){
  7. this.$router.push( '/home');
  8. }
  9. }
  10. }
  11. // 同于 history.back()
  12. this.$router.go( -1)
  13. // 同于 history.forward()
  14. this.$router.go( 1)

路由嵌套


   
  1. <template>
  2. <div class="hello">
  3. <h1>{{ msg }} </h1>
  4.  
  5. <p>导航 :
  6. <router-link to="/home">首页 </router-link> |
  7. <router-link to="/home/one">-子页面1 </router-link> |
  8. <router-link to="/home/two">-子页面2 </router-link>
  9. </p>
  10. <router-view/>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: 'Home',
  16. data () {
  17. return {
  18.              msg'dada!'
  19. }
  20. }
  21. }
  22. </script>
  23. <style scoped>
  24. </style>

子页面


   
  1. <template>
  2. <div class="hello">
  3. <h1>{{ msg }} </h1>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'One',
  9. data () {
  10. return {
  11. msg: 'Hi, I am One Page!'
  12. }
  13. }
  14. }
  15. </script>
  16. <style scoped>
  17. </style>
  18. <template>
  19. <div class="hello">
  20. <h1>{{ msg }} </h1>
  21. </div>
  22. </template>
  23. <script>
  24. export default {
  25. name: 'Two',
  26. data () {
  27. return {
  28. msg: 'Hi, I am Two Page!'
  29. }
  30. }
  31. }
  32. </script>
  33. <style scoped>
  34. </style>

路由配置


   
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Home from '@/components/Home'
  4. import One from '@/components/One'
  5. import Two from '@/components/Two'
  6. Vue.use(Router)
  7. export default new Router({
  8. routes: [
  9. {
  10. path: '/', // 默认页面重定向到主页
  11. redirect: '/home'
  12. },
  13. {
  14. path: '/home', // 主页路由
  15. name: 'Home',
  16. component: Home,
  17. children:[ // 嵌套子路由
  18. {
  19. path: 'one', // 子页面1
  20. component:One
  21. },
  22. {
  23. path: 'two', // 子页面2
  24. component:Two
  25. },
  26. ]
  27. }
  28. ]
  29. })

路由传递参数


   
  1. <router-link :to="{name:xxx, params: {key:value}}">
  2. dada
  3. < /router-link>

   
  1. <router-link :to="{name: 'one', params:{username:'123'}}">
  2. 子页面
  3. </router-link>

   
  1. {
  2.      path: 'one', // 子页面
  3. name: 'one', // 路由名称-命名路由
  4. component:One
  5. }
<h2>{{$route.params.username}}</h2>

url中传递参数


   
  1. {
  2. path: '/home/two/:id/:name', // 子页面
  3. component:Two
  4. },

   
  1. <p>ID:{{ $route.params.id}} </p>
  2. <p>名称:{{ $route.params.name}} </p>
<router-link to="/home/two/1/达达">子页面</router-link>

编程式导航带参数


   
  1. {
  2.      path: '/home/three', // 子页面
  3. name: 'three',
  4. component:Three
  5. }

   
  1. <p>ID:{{ $route.params.id}} </p>
  2. <p>名称:{{ $route.params.name}} </p>

   
  1. <button @click= "toThreePage">页面- params传参</button>
  2. // script
  3. methods: {
  4. toThreePage() {
  5. this.$router.push(
  6. {
  7. name: 'three',
  8. params: {
  9. id: 1,
  10. name: 'dada'
  11. }
  12. }
  13. )
  14. }
  15. }

query传参数


   
  1. {
  2.      path: '/home/three', // 子页面
  3. name: 'three',
  4. component:Three
  5. }

   
  1. <p>ID:{{ $route.query.id}} </p>
  2. <p>名称:{{ $route.query.name}} </p>

   
  1. <button  @click= "toThreePage">页面-params传参</button>
  2. methods: {
  3. toThreePage() {
  4. this.$router.push(
  5. {path: '/home/three', query: {id: 1, name: 'da'}}
  6. )
  7. }
  8. }

命名路由


   
  1. {
  2.      path'one', // 子页面
  3. name: 'one', // 路由名称-命名路由
  4. component: One // 页面组件
  5. }

   
  1. // template跳转调用
  2. <router-link :to= "{name: 'one'}">子页面</router-link>
  3. // router.push函数跳转调用
  4. router.push({ name: 'user'}})

   
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. // 创建页面组件
  4. const Header = { template: '<div>Header</div>' }
  5. const Left = { template: '<div>Left</div>' }
  6. const Right = { template: '<div>Right</div>' }
  7. Vue.use(Router)
  8. export default new Router({
  9. routes: [
  10. {
  11. path: '/', // 主页路由
  12. components: {
  13. default: Header,
  14. a: Left,
  15. b: Right
  16. }
  17. }
  18. ]
  19. })
  20. <template>
  21. <div id="app">
  22. <router-view />
  23. <router-view name="a" class="left" />
  24. <router-view name="b" class="right" />
  25. </div>
  26. </template>
  27. <script>
  28. export default {
  29. name: 'App'
  30. }
  31. </script>
  32. <style>
  33. #app {
  34. text-align: center;
  35. color: #2c3e50;
  36. width: 500px;
  37. border: 1px solid red;
  38. margin: 0 auto;
  39. }
  40. .left,.right{
  41. float: left;
  42. width:48%;
  43. text-align: center;
  44. border:1px solid red
  45. }
  46. </style>

重定向


   
  1. export default new Router({
  2. routes: [
  3. {
  4. path: '/', // 默认页面重定向到主页
  5. redirect: '/home' // 重定向
  6. },
  7. {
  8. path: '/home', // 主页路由
  9. component: Home,
  10. children:[ // 嵌套子路由
  11. {
  12.                 path: '/home/two/:id/:name', // 子页面
  13. component:Two
  14. },
  15. {
  16.                  path: '/home/three/:id/:name', // 子页面
  17. name: 'three', // 路由名称-命名路由
  18. redirect: '/home/two/:id/:name' // 重定向-传递参数
  19. },
  20. ]
  21. }
  22. ]
  23. })

   
  1. <router-link to="/">首页 </router-link> |
  2. <router-link to="/home/two/1/lisi">子页面 </router-link>  |
  3. <router-link :to="{name: 'three', params: {id: 1, name: 'dada'}}">
  4. 子页面
  5. </router-link>
redirect: '/home' // 重定向-不带参数
redirect: '/home/two/:id/:name' // 重定向-传递参数

别名


   
  1. {
  2.      path: '/one', // 子页面
  3. component:One,
  4. alias: '/oneother'
  5. }
<router-link to="/oneother">子页面1</router-link>

过渡动画


   
  1. <transition name="fade" mode="out-in">
  2. <router-view />
  3. </transition>


   
  1. .fade-enter-active {
  2. transition: opacity . 5s;
  3. }
  4. .fade-enter {
  5. opacity: 0;
  6. }
  7. .fade-leave {
  8. opacity: 1;
  9. }
  10. .fade-leave-active {
  11. opacity: 0;
  12. transition: opacity . 5s;
  13. }

mode模式


   
  1. export default new Router({
  2. mode: 'history', //mode模式
  3. routes: [...]
  4. })

404


   
  1. // 404
  2. {
  3. path: '*',
  4. component: () => import( '@/components/404')
  5. }

路由钩子,第一全局钩子,第二,路由单独钩子,第三,组件内钩子


   
  1. const router =  new VueRouter({ ... })
  2. // 全局路由拦截-进入页面前执行
  3. router.beforeEach( (to, from, next) => {
  4. next();
  5. });
  6. router.afterEach( () => {
  7. });
  8. export default router;

路由单独钩子


   
  1. {
  2.      path: '/home/one'// 子页面
  3. component: One,
  4. beforeEnter: (to, from, next) => {
  5. console.log( '进入前执行');
  6. next();
  7. }
  8. }

组件内钩子


   
  1. <script>
  2. export default {
  3. name: 'Two',
  4. data () {
  5. return {
  6.              msg'dada'
  7. }
  8. },
  9. beforeRouteEnter(to, from, next) {
  10. console.log( '进入enter路由钩子')
  11. next()
  12. },
  13. beforeRouteLeave(to, from, next){
  14. console.log( '进入leave路由钩子')
  15. next()
  16. },
  17. beforeRouteUpdate(to, from, next) {
  18. console.log( '进入update路由钩子')
  19. console.log(to.params.id)
  20. next()
  21. }
  22. }
  23. </script>

路由


   
  1. import Home  from  '@/components/Home'
  2. {
  3. path: '/home',
  4. component: Home
  5. }

面试官问:你了解vuex是什么吗?要不也说说

达达回答:好的。

vuex是一个为 Vue.js 应用程序开发的状态管理模式。采用集中式存储管理应用的所有组件的状态,以相应的规则保证状态以一种可预测的方式发生变化。

单向数据流

vuex的核心

安装

npm install vuex --save

使用


   
  1. import Vue  from  'vue'
  2. import Vuex  from  'vuex'
  3. Vue.use(Vuex)
  4. const state = {
  5. count: 1
  6. }
  7. const mutations = {
  8. DA(state, n) {
  9. state.count += n;
  10. }
  11. }
  12. const getters = {
  13. count: function(state){
  14. return state.count;
  15. }
  16. }
  17. const actions ={
  18. // 触发mutations中相应的方法-一般小写
  19. add ({commit}, data) {
  20. commit( 'DA', data)
  21. }
  22. }
  23. const store = new Vuex.Store({
  24. state,
  25. mutations,
  26. getters,
  27. actions
  28. });
  29. export default store;
<h2>{{ $store.state.count }}</h2>

   
  1. computed: {
  2.     count() {
  3. return this.$store.state.count;
  4. }
  5. }

   
  1. computed: mapState({
  2. // es5写法
  3. count: function (state) {
  4. return state.count;
  5. },
  6. // es6写法
  7. count: state => state.count
  8. })

   
  1. 数组获取
  2. computed: mapState([ 'count'])

   
  1. computed: mapState({
  2. count: 'count'
  3. })

   
  1. <button  @click= "$store.commit('DA')">+</button>
  2. const mutations = {
  3. // 状态变更函数
  4. DA(state) {
  5. state.count++;
  6. }
  7. }

每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块,从上至下进行同样方式的分割。


   
  1. // 模块A
  2. const moduleA = {
  3. state: { ... },
  4. mutations: { ... },
  5. actions: { ... },
  6. getters: { ... }
  7. }
  8. // 模块B
  9. const moduleB = {
  10. state: { ... },
  11. mutations: { ... },
  12. actions: { ... }
  13. }
  14. // 组装
  15. const store = new Vuex.Store({
  16. modules: {
  17. a: moduleA,
  18. b: moduleB
  19. }
  20. })
  21. // 取值
  22. store.state.a // -> moduleA 的状态
  23. store.state.b // -> moduleB 的状态

面试官最后一问:你了解axios吗?

达达回答:嗯,用过。

Axios 是基于 promise 的 HTTP 库,用在浏览器和 node.js 中。就是前端最火最简单的一个http请求解决方案。

安装

npm install vuex --save

代码封装


   
  1. import fetch  from  '@/util/fetch'
  2. const TMPURL = ''; // url地址
  3. const params = {}; // 参数
  4. fetch.post(TMPURL + '/login/login', params);

   
  1. import axios  from  'axios';
  2. const httpService = axios.create({
  3. baseURL: process.env.BASE_API, // 需自定义
  4. // 请求超时时间
  5. timeout: 3000
  6. });
  7. // request拦截器
  8. httpService.interceptors.request.use(
  9. config => {
  10.          // 加入token
  11.          if ( true) { 
  12. config.headers[ 'User-Token'] = '';
  13. }
  14. return config;
  15. },
  16.     error => 
  17. Promise.reject(error);
  18. }
  19. )
  20. // respone拦截器
  21. httpService.interceptors.response.use(
  22.      response => {
  23. const res = response.data;
  24.          if (res.statuscode !=  1) {
  25. return Promise.reject({
  26. status: res.statuscode,
  27. message: res.message
  28. });
  29. } else {
  30. return response.data;
  31. }
  32. },
  33. error => {
  34. if (error && error.response) {
  35. switch (error.response.status) {
  36. case 400:
  37. error.message = '错误请求';
  38. break;
  39. case 401:
  40. error.message = '未授权,请重新登录';
  41. break;
  42. case 403:
  43. error.message = '拒绝访问';
  44. break;
  45. case 404:
  46. error.message = '请求错误,未找到该资源';
  47. break;
  48. case 405:
  49. error.message = '请求方法未允许';
  50. break;
  51. case 408:
  52. error.message = '请求超时';
  53. break;
  54. case 500:
  55. error.message = '服务器端出错';
  56. break;
  57. case 501:
  58. error.message = '网络未实现';
  59. break;
  60. case 502:
  61. error.message = '网络错误';
  62. break;
  63. case 503:
  64. error.message = '服务不可用';
  65. break;
  66. case 504:
  67. error.message = '网络超时';
  68. break;
  69. case 505:
  70. error.message = 'http版本不支持该请求';
  71. break;
  72. default:
  73. error.message = `未知错误${error.response.status}`;
  74. }
  75. } else {
  76. error.message = "连接到服务器失败";
  77. }
  78. return Promise.reject(error);
  79. }
  80. )
  81. /*
  82. * get请求
  83. * url:请求地址
  84. * params:参数
  85. * */
  86. export function get(url, params = {}) {
  87. return new Promise( (resolve, reject) => {
  88. httpService({
  89. url: url,
  90. method: 'get',
  91. params: params
  92. }).then( response => {
  93. resolve(response);
  94. }).catch( error => {
  95. reject(error);
  96. });
  97. });
  98. }
  99. /*
  100. * post请求
  101. * url:请求地址
  102. * params:参数
  103. * */
  104. export function post(url, params = {}) {
  105. return new Promise( (resolve, reject) => {
  106. httpService({
  107. url: url,
  108. method: 'post',
  109. data: params
  110. }).then( response => {
  111. resolve(response);
  112. }).catch( error => {
  113. reject(error);
  114. });
  115. });
  116. }
  117. /*
  118. * 文件上传
  119. * url:请求地址
  120. * params:参数
  121. * */
  122. export function fileUpload(url, params = {}) {
  123. return new Promise( (resolve, reject) => {
  124. httpService({
  125. url: url,
  126. method: 'post',
  127. data: params,
  128. headers: { 'Content-Type': 'multipart/form-data' }
  129. }).then( response => {
  130. resolve(response);
  131. }).catch( error => {
  132. reject(error);
  133. });
  134. });
  135. }
  136. export default {
  137. get,
  138. post,
  139. fileUpload
  140. }

推荐系列

推荐阅读  点击标题可跳转

【面试Vue全家桶】vue前端交互模式-es7的语法结构?async/await

【面试需要-Vue全家桶】一文带你看透Vue前端路由

【面试需要】掌握JavaScript中的this,call,apply的原理

2019年的每一天日更只为等待她的出现,好好过余生,庆余年 | 掘金年度征文

进来就是一家人【达达前端技术社群⑥】

觉得本文对你有帮助?请分享给更多人

关注「达达前端」加星标,提升前端技能

在博客平台里,未来的路还很长,也希望自己以后的文章大家能多多支持,多多批评指正,我们一起进步,一起走花路。

非常感谢读者能看到这里,如果这个文章写得还不错,觉得「达达」我有点东西的话,觉得我能够坚持的学习,觉得此人可以交朋友的话, 求点赞,求关注,求分享,对暖男我来说真的

非常有用!

感谢阅读,原创不易,喜欢就点个[在看] or [转发朋友圈],这是我写作最大的动力。

意见反馈

若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。

这是一个有质量,有态度的公众号

点关注,有好运

好文章,我在看❤️


转载:https://blog.csdn.net/qq_36232611/article/details/104075158
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场