selector{ key:value;}第2阶段:得保证嵌套标签要合理 ,逻辑思维,编程思维。声明变量、数据类型、运算符(算术、赋值、比较、逻辑、三目)、 声明函数( 参数、this )、分支语句( if,switch ),..">
当前位置:   article > 正文

回顾及vue初识

回顾及vue初识

第1阶段:

html css 。 浮动、定位布局、mdeia(百分比)、响应式、flex、rem布局

<tagname key="value"></tagname>
<tagname key="value" />
selector{
    key:value;
}

第2阶段:

得保证嵌套标签要合理 ,逻辑思维,编程思维。

声明变量、数据类型、运算符(算术、赋值、比较、逻辑、三目)、 声明函数( 参数、this )、分支语句( if,switch ),循环(for/while/do...while/for...in)

面向对象(原型和原型链),类和函数有原型prototype,对象有原型链 __proto__

内置对象:它身上的方法而已。Math、Date、RegExp、String、Array、Location、history、locastorage

高级:事件( 事件对象、事件流:冒泡和捕获、委托、)、BOM( 弹框、各种宽和高 )、DOM(节点操作、节点类型)

第3阶段:

前端工程师的提升阶段。(接口可以不用会写,express和mysql)

git/es6/ajax/http协议/传参的方式/你得会看着接口文档调用接口/promise和async/node的npm

第4阶段:

二、Vue

2.1 vue初探

2.1.1官网

Vue.js

2.1.2 介绍

插件:日历插件、轮播图、选项卡。

框架:bootstrap。能够独立做来一个一个网页(项目就是由每一个网页组成 ) 响应式布局的项目

vue是渐进式 JavaScript 框架

渐进式 :主张最少。最大的特点是没有DOM操作。主张只操作数据 。

2.1.3 优点

1.轻量级的数据框架
2.双向数据绑定
3.提供了指令
4.组件化开发
5.客户端路由
6.状态管理:同cookie、session、本地存储类似

2.1.4 缺点

1.Vue 底层基于 Object.defineProperty 实现数据响应式,而这个 api 本身不支持 IE8 及以下浏 览器,所以Vue不支持IE8及其以下浏览器;
2.Vue 打造的是SPA,所以不利于搜索引擎优化(SEO); single page application
    以前是每一个显示的页面都应该有一个html才能设置不同的title、description、keywords
    app
    做项目时,必须使用Vue的脚手架创建项目,但脚手架就是基于webpack的一个脚手架。
3.由于 CSR的先天不足,导致首屏加载时间长,有可能会出现闪屏。
    client side render: 客户端渲染( 后端提供json数据,前端拼接字符串,再渲染 )
    server side render: 服务端渲染( json+html拼接字符串都在后端做,返回给前端 )

2.1.5 核心

数据驱动( 数据改变驱动我们视图的改变 ) 组件系统

2.1.6 MVVM

M-model模型
V-view视图
VM-viewModel 视图模型
模型(model)通过了视图模型  决定了视图(view)
视图(view)  通过视图模型 修改模型 (model) 
视图模型是模型和视图之间的桥梁。

2.1.7 SPA :vue或react、小程序

single page application
你的项目里面只有一个index.html
但是肯定也要以多页面视图展示。但是我们没有体会到页面刷新。
index.html#cinema
index.html#movies
index.html#movie/classic
​
实现原理:地址栏#后面变化了,然后发送ajax请求,实现页面的变化  
地址栏发生变化会向服务器发请求,但是#后面变化不会发请求。
体验好。第1次访问可能会出现白屏,但是后面整体体验是很好的

2.1.8 MPA : js + jq

mutiple page application
movies.html
movie.html
actor.html
seo 好,整体体验不好

2.2 vue初体验

基于js封装出来的一个前端框架。

2.2.1 安装

1.cdn [不推荐]:线上的一个网址
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
2.npm  [推荐]
3.脚手架[做项目]

2.2.2 引用

​
    <!-- 
        引入方式:
     -->
     <!-- 
         1. CDN: 就是引入一个线上的地址。
      -->
      <!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
      <!-- 
          开发阶段: 写的一些代码提示相对更好
       -->
      <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> -->
      <!-- 
          生产阶段
       -->
      <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script> -->
​
​
      <!-- 
         2. 使用npm下载到本地
       -->
       <!-- <script src="./node_modules/vue/dist/vue.js"></script> -->
       <script src="vue.js"></script>
​
       <!-- 
           3. 项目肯定是 脚手架帮我们搭好所有的架子么。
        -->
​
      <script>
        // 在局部就暴露出一个 Vue 构造函数,那必然是要实例化Vue的
        console.log( Vue );
      </script>

2.3 vue实例

2.2.1 如何用? el

 <!-- 1.书写Vue实例要控制的视图容器,按照规范我们往往取一个id名叫app -->
    <div id="a">
        {{ 1 }}
    </div>
​
    <!-- 2.引入Vue.js  -->
    <script src="vue.js"></script>
​
    <script>
        // 3. 实例化Vue
​
            //Vue = function ( options ){}
        let vm = new Vue( {
            el:'#a',// element: 这个vue对象要控制哪个视图容器
        } ) //会返回一个对象   
​
        // console.log( typeof vm,vm );  object 
​
    </script>

不按照规范:会报错

<body >
    
    <!-- 1.书写Vue实例要控制的视图容器,按照规范我们往往取一个id名叫app -->
    <div class="b">
        {{ 1 + 2 }}
    </div>
    <div class="b">
        {{ 1 + 2 }}
    </div>
​
   
</body>
 <!-- 2.引入Vue.js  -->
 <script src="vue.js"></script>
​
 <script>
     // 3. 实例化Vue
​
         //Vue = function ( options ){}
     new Vue( {
         el:'.b',// element: 这个vue对象要控制哪个视图容器
                  //只有第1个容器生效   querySelector
         /*
            1) Do not mount Vue to <html> or <body> - mount to normal elements instead.
         */
     } ) 
​
​
 </script>

2.2.3 data methods {{}} 模板语法

​
<body>
    <div id="app">
        <!-- 这个app容器中可以使用data中的数据, -->
        {{ username }}
        <hr>
        {{ num }}
        <hr>
        {{ person }}
        <hr>
        {{ isChecked }}
        <hr>
        {{ persons }}
        <hr>
        {{ person.username }}
        <hr>
​
        <!-- 
            {{}} mustache语法  
            花括号中只可以写一行js表达式 。
            在花括号中不会出现if和for的
        -->
        <h2>  mustache语法   </h2>
        {{ 5 + 5 }}
        <hr>
        {{ tel }}
        <hr>
        {{ 'a' + 'b' + username }}
        <hr>
        {{ person.age >= 18 ? '成年': '呵呵 ' }}
​
        <hr>
        <!-- 函数调用也属于表达式 -->
        <!-- 说明可以在花中可以调用js内部的方法,那么也就意味着可以调用自己定义的方法 -->
        {{ tel.substring( 0,3 ) + '****' + tel.substring( 7 ) }}
        <hr>
        {{ getNum() }}
        <hr>
        {{ getChecked() }}
        <hr>
        {{ fn1() }}
    </div> 
    
    <hr>
    <!-- 放在外面和vue实例无任何关系 -->
    <!-- {{ num }} -->
</body>
<script src="vue.js"></script>
<script>
​
    function fn(){
        return '1234'
    }
​
    // 5 + 5
​
    // var a = 10
    // console.log( a );
    //t.substring( 0,3 ) + '****' + t.substring( 7 )
​
    // 'a' + 'b'
​
    new Vue({
        el: '#app',
        data:{ //vue实例所控制的容器中所需要的数据
            num:123,
            username:'张三',
            isChecked:true,
            person:{
                username:'李四',
                age:15
            },
            persons:[
                { username:'a' },
                { username:'b' }
            ],
            tel:'15811112222',//  15811112222 => 158****2222
        },
        methods:{
            //这里定义函数类型=》 方法
            getNum:function(){
                return 20
            },
            //推荐使用es6的简写写法的函数,回调使用箭头函数
            getChecked(){
                return true
            },
            // 为什么在methods中不定义箭头函数 ;因为在methods中定义箭头函数this不指向vue实例
            // fn1:()=>{
            //     console.log( this,'fn1----' );
            // }
            fn1(){
                // console.log( this,'fn1----' );
​
                //let _this = this
                // function fn2(){
                //     // console.log( this,'fn2' ); //window 
                //     //console.log( _this,'fn2' ); //vm 
                // }  
                
                let fn2 = ()=>{
                    console.log( this,'fn2' );
                }
​
                fn2() // window.fn2()
​
            }
        }
    })
​
</script>

2.4 指令

2.4.1 非表单元素绑定数据

v-text | v-html

指的是 div、p、ul、li,

​
<body>
    <div id="app">
      
        <!-- 
                <h2>非表单元素绑定数据 | v-text/v-html</h2>
                <h2>普通元素:div、p、ul、span</h2>
                <h2>指令:以元素自定义属性的方式存在的,以v-开头</h2>
                区别:
                v-text                      ==>                {{}}
                会把标签中的内容全部替换掉                     解析表达式
         -->
         <h3> 我的姓名叫: {{ username }} </h3>
         <h3 v-text=" '我的姓名叫:' + username"></h3>
         <h3 v-text=" '我的姓名叫:' + username">aaa</h3>  
         <div>
             {{ str }}
         </div>
         <div v-text="str"></div>
​
         <h2>v-html指令</h2>
         <div v-html="str"></div> 
        
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data:{
            username:'张三',
            str:'<h2>hello</h2>'
        }
    })
</script>

2.4.2 表单元素绑定数据

v-model。mvvm

M-model模型
V-view视图
VM-viewModel 视图模型
模型(model)通过了视图模型  决定了视图(view)
视图(view)  通过视图模型 修改模型 (model) 
视图模型是模型和视图之间的桥梁。
​
<body>
    <div id="app">
​
        {{ username }}
        <hr>
        <input v-model="username">
       <button @click="fn">点击我</button>
    </div>
</body>
<script src="vue.js"></script>
<script>
​
    /*
        input.oninput = function(){
            this.value 
        }
    */ 
​
    /*
        vun:
            核心的mvvm原理。
            数据驱动。数据变了影响视图的变化 
            m: model( 模型,data数据即可 )
            v: view ( 视图 )
            vm: 视图模型 ( vue.js )
            vm.data.username
            vm.username
    */ 
    let vm = new Vue({
        el: '#app',
        data:{//data的数据在我们new Vue的时候,vue帮我们放到vm实例对象上
            username:'zs',
            age:20
        },
        
        methods:{//methods中的函数在我们new Vue的时候,vue帮我们放到vm实例对象上
            fn(){
                console.log(this,'fn')
                console.log(this === vm,'fn')
            }
        }
    })
​
    console.log( vm ,'vue的实例'); //data的数据在我们new Vue的时候,vue帮我们放到vm实例对象上
    // console.log( vm.username )
</script>

2.4.3 属性绑定-媒体元素

v-bind / :

<body>
    <div id="app">
        <!-- 
            v-bind:属性名="值"
            简写方式 :
         -->
        <div class="aa">绑定自带属性和自定义属性</div>
        <div v-bind:class=" clsName ">绑定自带属性和自定义属性</div>
        <div :class=" clsName ">:简写形式:绑定自带属性和自定义属性</div>
        <div :class=" clsName + 'cc' "  :c="'c1'">:简写形式:绑定自带属性和自定义属性</div>
        
        <hr>
        <h2>绑定属性场景</h2>
​
        <a :href="webSiteInfo.href" target="_blank" :title="webSiteInfo.name">
            <img :src="webSiteInfo.logo" alt="">
        </a>
​
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            clsName:'bb',
            webSiteInfo:{
                name:'京东',
                href:'https://www.jd.com',   //360buy.com
                logo:'https://misc.360buyimg.com/mtd/pc/index_2019/1.0.0/assets/sprite/header/sprite.png'
            }
        }
    })
</script>

2.4.4 事件绑定

v-on/@,以行间形式绑定事件

​
<body>
    <div id="app">
        <!-- 
            v-on:事件名="事件函数" ,函数写在methods中
            @事件名="事件函数" ,函数写在methods中
            不传递参数可以不加小括号
         -->
        <button v-on:click="clickMe1">点击我1</button>
        <button @click="clickMe1">点击我1</button>
         <hr>
         {{ username }}
         <hr>
        <button @click="changeName('鲁班')">改成-鲁班</button>
        <button @click="changeName('程咬金')">改成-程咬金</button>
​
    </div>
</body>
<script src="vue.js"></script>
<script>
​
    // changeName('鲁班')
​
    new Vue({
        el: '#app',
        data: {
            username:'赵云'
        },
        methods:{
            clickMe1(){
                console.log( 'clickme1',this );
            },
            changeName( username ){
                // console.log( username,'aaa' );
                this.username = username //改变了data模型中的username变量
            }
        }
    })
</script>

2.4.5 条件渲染

​
<body>
    <div id="app">
​
        <!-- 
            v-show="条件": 原理( display:block/none )  通过样式实现的,
            如果条件为真则标签显示,假则不显示
         -->
​
         <h2 v-show=" age >= 18 ">成年</h2>
         <h2 v-show=" age < 18 ">呵呵</h2>
​
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            age:15
        }
    })
</script>
​

v-if VS v-show

​
 <div id="app">
​
        <!-- 
            v-if="条件": 原理  
            如果条件为真则标签渲染到html中,假则不渲染在html中
​
            v-if/v-else
​
            v-if/v-else-if/v-else  : 在使用v-if、v-else-if 标签要紧挨着
         -->
​
         <h2 v-if=" age >= 18 ">成年</h2>
         <h2 v-if=" age < 18 ">呵呵</h2>
​
​
         <!-- 
             优良中
​
             90-100 优
             80-90 良
             70-80 中
             
          -->
​
          <div>
            <span v-if="score >=90 && score <=100">优</span>
            <span>----------------</span>
            <span v-if="score >=80 && score <90">良</span>
            <span v-if="score >=70 && score <80">中</span>
        </div>
​
        
        <div>
            <span v-if="score >=90 && score <=100">优</span>
            <span v-else-if="score >=80 && score <90">良</span>
            <span v-else-if="score >=70 && score <80">中</span>
            <span v-else>差</span>
        </div>
​
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            age:20,
            score:65
        }
    })
</script>
​

v-show之选项卡

v-if之购物车

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-if与v-show的应用场景</title>
</head>
<style>
    .box{
        width: 300px;
        height: 300px;
        padding: 10px;
        border: 2px  solid salmon;
    }
    button.active{
        background-color: red;
        color: white;
    }
</style>
<body>
    <div id="app">
        <h2>show: 应用在选项卡切换</h2>
        <button @click="changeIndex(0)" :class=" index == 0?'active':'' ">猪八戒技能切换</button>
        <button @click="changeIndex(3)" :class=" index == 3?'active':'' ">孙悟空技能切换</button>
        <button @click="changeIndex(2)" :class=" index == 2?'active':'' ">孙尚香技能切换</button>
        <button @click="changeIndex('abc')" :class=" index == 'abc'?'active':'' ">鲁班技能切换</button>
        <div v-show="index == 0" class="box">猪八戒信息-一些技能</div>
        <div v-show="index == 3" class="box">孙悟空信息-一些技能</div>
        <div  v-show="index == 2"  class="box">孙尚香信息-一些技能</div>
        <div  v-show="index == 'abc'"  class="box">鲁班信息-一些技能</div>
​
​
​
        <h2>打开这个页面,某些标签元素根据数据就决定了显示与否,后期不会频繁切换,用v-if、 购物车</h2>
​
        <div v-if="shops.length !== 0">
            要遍历shops的
        </div>
​
        <div v-if="shops.length == 0">
            空空如也~,一个小购物车空的图片
        </div>
​
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            index:0,//控制选项卡切换的索引变量
            shops:[
                '小米10',
                '华为mate40'
            ]
        },
        methods:{
            changeIndex(index){
                this.index = index
            }
        }
    })
</script>
​
</html>

2.4.6 循环与对比机制

v-for指令

循环

双重循环

<style>
    .box {
        border: 1px solid red;
        margin: 10px;
    }
</style>
​
<body>
    <div id="app">
​
        <!-- 
            v-for="(value,index) in 数组"   | value,index可以随意起,符合变量规范即可。 item
            v-for="value in 数组"
         -->
​
        <div class="box" v-for="item in persons">
            <!-- item: 当前的遍历项 {{item}} -->
            遍历项-- --- 姓名是:{{item.username}}
        </div>
​
        <div class="box" v-for="(item,index) in persons">
            <!-- item: 当前的遍历项 {{item}} -- index:下标 -->
            遍历项-- --- 姓名是:{{item.username}} ---{{ index }}
        </div>
​
        <h2>遍历对象</h2>
        <div>
            <span v-for="( value,key ) in person"> {{value}}___{{key}}
                <hr>
            </span>
​
        </div>
​
        <h2>二维数组的遍历</h2>
        <div v-for="(item1) in movies">
            电影名称:{{item1.name}}
            <hr>
            <hr>
            <hr>
            演员: <span v-for="item2 in item1.starts"> {{item2}}  /</span>
        </div>
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            // 遍历数组是重点
            persons: [
                { id: 'a0001', username: 'zs' },
                { id: 'a0003', username: 'ls' },
                { id: 'a0005', username: 'ww' },
            ],
            // 对象了解即可
            person: {
                id: 'a0007',
                username: '张三',
                age: 30
            },
            // 二维数组的遍历:掌握
            movies: [
                {
                    id: 'a0001',
                    name: '沙丘 Dune ',
                    starts: ["蒂莫西·柴勒梅德", "丽贝卡·弗格森", "奥斯卡·伊萨克", "戴夫·巴蒂斯塔"]
                },
                {
                    id: 'bsdf1',
                    name: '天书奇谭',
                    starts: ["丁建华", "毕克", "苏秀", "程晓桦", "施融"]
                }
            ]
        }
    })
</script>

对比机制|v-bind:key => :key

vue对比传统的渲染要很快的。为什么?因为vue自己封装的时候研究一个套对比机制(叫虚拟DOM)

比如用数组描述一个人
[ '张三',18,110 ]
{ username:'张三',age:18,shuxue:110 }
<tagname key=value>文本内容</tagname>
<div id="div1" class="box">
	我是内容 <h2>我是h2标签</h2>
	 <h3>我是h3标签</h3>
</div>
{
	name:'div',
	attrs:{
		id:'div1',
		class:'box',
		a:'111',
		b:'222'
	},
	text:'我是内容',
	children:[
		{
			name:'h2',
			
		},
		{}
	]
}



{
	name:'div',
	attrs:{
		id:'div1',
		class:'box',
		a:'111',
		b:'222'
	},
	text:'我是内容',
	children:[
		{
			name:'h2',
			
		},
		{}
	]
}

使用下标当作key和不加key默认是一样的,默认就是使用index下标当作key的,但是可能会造成数据错乱 所以应该使用数据中表示唯一标识当作key: id 学号 身份证 手机号....

 <div id="app">
        <button @click="addUser">添加用户小明</button>
        <ul>
            <!-- 
                v-bind:key:在这里代表唯一的意思,同时呢是为了我们的循环项绑定一个唯一的值。
             -->
            <li v-for="(item,index) in persons" :key="item.id">
                姓名:{{item.username}}
                <input value="">
            </li>
        </ul>

        <!-- 
            刚才的对比回放
            使用下标当作key和不加key默认是一样的,默认就是使用index下标当作key的,但是可能会造成数据错乱
            所以应该使用数据中表示唯一标识当作key: id 学号 身份证  手机号....

            

         -->



    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            persons: [
                { id: 'a0001', username: 'zs' },
                { id: 'a0003', username: 'ls' },
                { id: 'a0005', username: 'ww' },
            ],
        },
        methods:{
            addUser(){
                let user = { username:'小明',id:Math.random() }
                // this.persons.push( user )
                this.persons.unshift( user )
            }
        }
    })
</script>

2.4.7 动态类名

class/style

<!-- 
    控制样式:
    1) style="" 行内样式
    2)  class    非行内样式
 -->

<style>
    /* ... */
    .c1 {
        background-color: red;
    }

    .c2 {
        background-color: sandybrown;
    }

    .ftS1{
        font-size: 30px;
    }
    .ftS2{
        font-size: 60px;
    }
</style>

<body>
    <div id="app">
        <button class="" :class="cName" @click="changeBg">点击我按钮</button>
        <hr>
        <!-- 三目运算 -->
        <button :class=" flag?'c1':'c2' ">三目运算</button>
        <hr>
        <!-- :class里面,官方建议使用数组包裹 -->
        <button :class=" [flag?'c1':'c2',flag?'ftS1':'ftS2'] ">官方建议使用数组包裹</button>
        <hr>
        <!-- 对象的写法 -->
        <button :class="{ c1:flag,ftS1:flag,c2:!flag,ftS2:!flag }">对象的写法</button>
    </div>
</body>
<script src="vue.js"></script>
<script>
//  flag?'c1':'c2'
    // var flag = xxxx

    // {
    //     //key:value
    //     类名:布尔值
    // }

    /*
        {
            c1:flag,
            ftS1:flag,
            c2:!flag,
            ftS2:!flag
        }
    */

    new Vue({
        el: '#app',
        data: {
            cName:'c1',
            flag:true
        },
        methods: {
            changeBg() {
                
                if( this.flag == true ){
                    this.cName = 'c2'
                    this.flag = false //在js中访问变量或方法需要加;this
                }else{
                    this.cName = 'c1'
                    this.flag = true
                }
            }
        }
    })
</script>

style

<body>
    <div id="app">
        <button style="background-color: salmon; color: white;">style</button>
        <button :style="{color:'white',backgroundColor:'salmon'}">style</button>
        <button :style="{color:'white','background-color':'salmon'}">style</button>
    </div>
</body>
<script src="vue.js"></script>
<script>

    // 
    
    let styleObj = {
        color:'white',
        'background-color':'salmon'
    }

    // xxx.style.backgroundColor = 'red'

    new Vue({
        el: '#app',
        data: {
        }
    })
</script>

2.4.8 一次性绑定: 了解

v-once

<body>
    <div id="app">
        <input type="text" v-model="username">
        <hr>
        {{username}}
        <span v-once>{{username}}</span>  
        <!-- 添加v-once指令的标签中的数据只会渲染一次,不会随着数据的变化而变化 -->
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            username:'zs'
        }
    })
</script>

三、面试题

1.对于Vue是一套渐进式框架的理解。

主张最少,需要什么就添加什么 。比如UI框架。

2.请列出至少4个vue基本指令,并简要说明其作用。

v-on/v-text/v-html/v-for/v-if/v-bind/v-model

3.v-show与v-if 有什么区别?

4.说说你对SPA的理解,它的优缺点分别是什么?

SPA:单页面应用。
优点:
	用户体验好、快,内容的改变不需要重新加载整个 页面,避免了不必要的跳转和重复渲染;
	基于上面一点, SPA 相对对服务器压力小;前后端职责分离,架构清晰, 前端进行交互逻辑,后端负责数据处理;
缺点:
	初次加载耗时多:为实现单页 Web 应用功能及显 示效果,需要在加载页面的时候将 JavaScript、CSS 统一 加载,	部分页面按需加载;
	前进后退路由管理:由于单页 应用在一个页面中显示所有的内容,所以不能使用浏览器 的前进后退功能,所有的页面切换需要自己建立堆栈管理;
	SEO 难度较大:由于所有的内容都在一个页面中动态 替换显示,所以在 SEO 上其有着天然的弱势。

5.单页面(SPA)和多页面(MPA)的区别?—不用背

单页面(SPA)多页面(MPA)
刷新方式页面局部刷新或更改整页刷新
url 模式a.com/#/pageone a.com/#/pagetwoa.com/pageone.html a.com/pagetwo.html
用户体验页面片段间的切换快,用户体验良好页面切换加载缓慢,流畅度不够,用户体验比较差
转场动画容易实现无法实现
数据传递容易依赖 url传参、或者cookie 、localStorage等
搜索引擎优化(SEO)需要单独方案、实现较为困难、不利于SEO检索 ,可利用服务器端渲染(SSR)优化实现方法简易
适用范围高要求的体验度、追求界面流畅的应用适用于追求高度支持搜索引擎的应用
开发成本较高,常需借助专业的框架较低 ,但页面重复代码多
维护成本相对容易相对复杂

6.什么是MVVM模式?

M-model模型
V-view视图
VM-viewModel 视图模型
模型(model)通过了视图模型  决定了视图(view)
视图(view)  通过视图模型 修改模型 (model) 
视图模型是模型和视图之间的桥梁。

7.vue中 key 值的作用?

当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认 用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移 动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个 元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。

复习

onfocus onblur onchange oninput

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/892823
推荐阅读
相关标签