vue指令

Vue

vue初探

官网

https://cn.vuejs.org/

介绍

vue是渐进式 JavaScript 框架

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

优点

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

企业要求要会、效率高、做出的活儿好。

缺点

1.Vue 底层基于 Object.defineProperty 实现数据响应式,而这个 api 本身不支持 IE8 及以下浏 览器,所以Vue不支持IE8及其以下浏览器;
2.Vue 打造的是SPA,所以不利于搜索引擎优化(SEO); single page application
	以前是每一个显示的页面都应该有一个html才能设置不同的title、description、keywords
3.由于 CSR的先天不足,导致首屏加载时间长,有可能会出现闪屏。
	client side render: 客户端渲染

核心

数据驱动 组件系统

MVVM

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

         input元素值变的同时其它地方跟着变 
         oninput = function(){
             ...code
         }
         我们vue是如何实现这种功能的,底层就是使用的mvvm设计模式实现的。
         m: model 模型(理解我们的data数据)
         v: views 视图(html网页:标签和css)
         vm: viewModel: 视图模型,其实就是vue框架

         数据驱动:数据的变化会影响视图的改变,视图的改变也会影响数据的。

SPA

single page application 单页面应用

用到的技术栈:Vue + 现成的组件库

优点:加载快,用户体验好(像在用app一样)
缺点:不利于SEO,首屏加载时间长
a页面—>index.html/#/a
b页面—>index.html/#/b
vue页面应用 的路径后面根据 锚点的不同来进行设计的。因为锚点是前端用的(比如:点击某个链接跳转到当前页面的某个地方)

MPA

多页面应用:mutilple page application

js + jquery

优点:有利于SEO
缺点:会有白屏,用户体验不好
a页面—>a.html
b页面—>b.html

vue流程

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

安装

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

引用

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./vue.js"></script>
<script src="./node_modules/vue/dist/vue.js"></script>
 <div id="aaa">
        <input type="text" placeholder="价格" v-model="price">
        <hr>
        <input type="text" placeholder="数量" v-model="num">
        <hr>
        <p>总价:{{ price * num }}</p>
    </div>

    <!-- 
        第1种方式:cdn安装
     -->
    <!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->

    <!-- 
        第2种方式:使用npm下载
        npm i vue
     -->
     <script src="./node_modules/vue/dist/vue.js"></script>

    <script>
        //我们需要实例化一个vue
        new Vue({
            el:'#aaa',
            data:{
                price:30,
                num:2
            }
        })
    </script>

vue实例

el

<script src="vue.js"></script>
<body>
    <!--  vue要控制的容器,一般用id -->
     <div class="box" id="app">
        <!-- vue的mustche语法,可以写js语法,但是只能写一行,所以也就不会出现分号 -->
        {{  2+2  }}
    </div>
 <script>
        //实例化一个vue对象
        new Vue( {
            //虽然有多个类名相同,但也会作用第1个。往往使用id。而id经常起名 app
            //不能挂载(mount)到body和html上。
            //Do not mount Vue to <html> or <body> - mount to normal elements instead.
            el:'#app',//也可以写document.querySelector('#app') vue控制的容器  
        } )
    </script>

data methods mounted

  • data初始化数据。对象
  • methods方法写在这里,注意不用箭头函数,因为无this。对象
  • mounted是一个Vue里有这个方法。函数
<div id="app">
        <!-- 只能写一行js代码表达式 -->
        {{ num }} --- {{ name }}
        {{ fn2() }}
    </div>
    
    <script src="vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            dats:{
                //作用的容器中所需要的数据
                num:10,
                name:'zs'
            },
            methods:{ //所有vue方法写在这里。
                fn2(){
                    // console.log(this,'fn2调用了')
                    return 123
                },
                fn3:()=>{ //在methods中定义的函数,不要用箭头函数
                    console.log(this,'fn3调用了')
                },
                b(){
                    log(1);
                }
            },
              mounted: function() { //自动触发写入的函数
                b();
            }
        })

    </script>

{{}} 模板语法

  • 模板既可以调用methods中的方法,那么也可以调用js的内置方法。
  • 不解析变量中标签。
<div id="app">
        <!-- 既可以调用methods中的方法,那么也可以调用js的内置方法 -->
       {{  'abc'.toUpperCase()  }}
       <hr>
       {{fn()}}
        <!-- 如果你的变量中有标签形式的字符串,不解析标签 -->
        {{ htmlStr }}
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                tel:'15311112222',
                age:10,
                htmlStr:'<em>从数据中拿到数据</em>'
            },
            methods:{ 
                fn(){
                  '15811112222'.substring(0,3) + '****' + '15811112222'.substring(7)
                }
            }
        })
    </script>

指令

  • 指令都是绑定在标签上,以属性的形式进行绑定

  • 在使用指令的时候,里面也可以书写js表达式,但是注意符合js语法

元素绑定数据

  • v-text会把标签中的内容给替换掉
  • {{}}和v-text解析一致
  • v-html解析标签
<div id="app">
         <div>{{name}}  --- 普通的html内容</div>
         <!-- v-text会把标签中的给替换掉 -->
         <div v-text=" name "></div>
         <div v-text=" name "> 我是div中的内容 </div>

         <!-- 在使用指令的时候,里面也可以书写js表达式,但是注意符合js语法 -->
         <div v-text=" name + 'hello' ">  </div>
         <!-- 变量中是什么,v-text解析后就显示什么 ,{{}}和v-text解析一致 -->
         <div v-text=" htmlStr ">  </div>

         <!-- v-html,解析标签,其它特点和v-text一模一样 -->
         <div v-html="htmlStr"></div>
         <!-- 
             {{}} : 不会替换标签中的原内容 -- 网速慢的话体验不好
             v-text:会替换标签中的原内容-- 网速慢的话不会展示乱七八糟的东西
             v-html:解析标签
          -->
    </div>
     <script src="vue.js"></script> 
    <script>
        new Vue({
            el: '#app',
            data: {
                name:'zs',
                htmlStr:'<em>从数据中拿到数据</em>'
            },
            methods: {
            }
        })
    </script>

表单元素绑定数据

  • v-model会获取value值并绑定变量或数组。
<div id="app">
        <input type="text" v-model="username">
        {{ username }}
    </div>
    <script src="vue.js"></script>

    <script>
       let vm = new Vue({
            el: '#app',
            data: {
                username:'zs'
            },
            methods: {
            }
        })
       vm.username = 'ls'
    </script>

属性绑定

v-bind:/ :

 <div id="app">
        <!-- v-bind: -->
        <img v-bind:src="imgSrc" width="200">
        <hr>
        <!-- v-bind简写: -->
        <img :src="imgSrc" width="200">
		<div a="1" b="2" :aaa="cid">绑定自定义属性</div>
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
               imgSrc:'https://img1.baidu.com/it/u=3303981320,1355171730&fm=26&fmt=auto',
          webSiteInfo:{
logo:'https://img10.360buyimg.com/img/jfs/t1/160510/16/25709/36032/616cea7eEd14780cc/43b0d9ed8c9e9ab0.png',
           name:'京东',
           url:'https://www.jd.com'
                },
           cid:'xxxx-xxxx-xxxx'
            },
            methods: {
            }
        })
    </script>

事件绑定

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

<div id="app">
<!--  v-on:click="函数名"/ @click="函数名",本质上是事件触发然后执行函数中的代码块 -->
        <button v-on:click="clickMe1">点击我</button>
        <button v-on:click="clickMe1()">点击我</button>
        <button @click="clickMe1">点击我</button>

        <button @click="changeUserName">点击我换成关羽</button>

<!--如果传参则 v-on:click="函数名( 参数1,参数2,... )"/ @click="函数名( 参数1,参数2,... )"-->
        <button @click="changeUserName1('张飞',20)">点击我换成张飞</button>
        用户名为:{{username}}

    </div>
    <script src="vue.js"></script>
    <script>
        //以前用原生js及jquery绑定基本上都是script标签内选择元素然后进行绑定
        // 绑定、事件对象、冒泡、默认行为、捕获.... 表单的事件、键盘事件
        new Vue({
            el: '#app',
            data: {
                username:'黄忠'
            },
            methods: {
                clickMe1(){
                    console.log( '点击了我1' )
                },
                changeUserName(){
                    // console.log( this,'vue实例对象' )
                    this.username = '关羽'
                },
                changeUserName1(uname,age){
                    //console.log('改变username的值',uname,age)
                    this.username = uname
                }
            }
        })
    </script>

条件渲染

 <div id="app">
            <!-- 
                选择性的显示与隐藏,有点类似我们的选项卡效果
                v-if:条件成立,标签会在页面上创建并渲染显示,如果不成立,则页面上不会有此标签的
                v-show:条件成立,标签会在页面上创建并渲染显示,如果不成立,会创建:display:none

                什么时候用v-if或v-show?
             -->
            <h2>v-if演示</h2>
            <div v-if="age>=18">成年</div>
            <div>-----------------------------</div>
            <div v-if="age<18">呵呵</div>
            
            <!-- 
                v-if如果和v-else一起使用,那么中间不要其它标签
             -->
             <div v-if="age>=18">成年</div>
            <div v-else>呵呵</div>  


            <!-- 
                v-if  v-else-if  v-else.
             -->

             <div v-if="score<100 && score>=90">你要上天啊</div>
             <div v-else-if="score<90 && score>=80">你要逆天啊</div>
             <div v-else>你要造火箭吗?</div>


             <h2>v-show演示</h2>
            <div v-show="age>=18">成年</div>
            <div>-----------------------------</div>
            <div v-show="age<18">呵呵</div> 
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                age:20,
                score:70
            },
            methods: {
            }
        })
    </script>

v-if VS v-show

<div id="app">
            <!-- 
                频繁切换用v-show:它不会频繁创建和删除标签( 会影响性能 ),用的是样式实现的。
                打开页面就决定是否显示,则可以用v-if: 购物车可以用
             -->
          <button @click="openOrOff">打开or关闭1</button>

          <!--  如果事件中只有一句话,可以直接写行间中 -->
          <button @click="flag = !flag">打开or关闭2</button>
          <!--  <div v-if="flag">开关灯</div> -->
          <div v-show="flag">开关灯</div>  
    </div>
    <script src="vue.js"></script>
    <script>

        // let flag = false
        // flag = !flag

        new Vue({
            el: '#app',
            data: {
               flag:true
            },
            methods: {
                openOrOff(){
                    this.flag = !this.flag
                }
            }
        })
    </script>

循环

 <div id="app">
        <!-- 
                掌握遍历数组即可。
                v-for="值 in 数组"
                v-for="(值,下标) in 数组"
                value/item   index/i
             -->
        <h2>遍历数组</h2>
        <!-- 1. v-for="值 in 数组" -->
        <div v-for="value in persons"> 姓名为: {{value}} </div>
    
        <!-- 2. v-for="(值,下标) in 数组" -->
        <div v-for="(item,index) in persons"> 姓名为: {{item}}----下标为:{{index}} </div>

        <h2>遍历对象</h2>
        <div v-for="value in userInfo">{{ value }}</div>
        <div v-for="(value,key) in userInfo">{{ value }}---{{key}}</div>
        <!-- 遍历数组套对象 -->
         <ul id="list">
             <li v-for="item in products">
                 <img :src="item.imgSrc" alt="">
                 <p>标题:{{item.title}}</p>
                 <p>价格:{{item.price}}</p>
             </li>
         </ul>
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                persons: [
                    '张飞',
                    '赵云',
                    '刘备'
                ],
                userInfo: {
                    username: '关羽',
                    skill: '温酒斩华雄',
                },
                products: [
                    {
                        id: 'a0001',
                        title: '8+256G学生小米华为通',
                        price: 599,
                        imgSrc: 'https://'
                    },
                    {
                        id: 'a1100',
                        title: '通8GB+128GB',
                        price: 1099,
                        imgSrc: 'https://
                    }
                ]
            },
            methods: {
            }
        })
    </script>

双重循环

 <div id="app">
            <div class="box" v-for="item in movies">
                电影名称:{{item.name}}
                <hr>
                主演:
                <em v-for="(people,index) in item.starts">
                    {{people}}   
                    <span v-if="index != item.starts.length-1">/</span> 
                </em> 
            </div>
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                movies:[
                    { 
                        id:'a0001',
                        name:'沙丘 Dune ',
                        starts:[ "丽贝卡·弗格森" , "奥斯卡·伊萨克" , "戴夫·巴蒂斯塔"  ]
                    },
                    {
                        id:'bsdf1',
                        name:'天书奇谭',
                        starts:["丁建华" , "毕克" , "苏秀" , "程晓桦" , "施融"]
                    }
                ]
            },
            methods: {
            }
        })
    </script>

对比机制

  • v-key

为什么vue渲染速度快,就是因为一套对比机制,而这个对比机制就少不了v-key的作用。

动态类名

  • class
<body>
    <div id="app">
            <!-- 1. 变量名 -->
            <div :class="classNam1">变量名</div>

            <!-- 2. 三目运算的表示法 -->
            <div :class=" flag1 ? 'bg2':'bg1' " >三目运算的表示法</div>

            <!-- 3. 建议套个数组,这样可以操作多个表达式 -->
            <div :class="[ flag1 ? 'bg2':'bg1',flag1 ? 'co2':'co1' ]" >三目运算的表示法</div>

            <!-- 4.对象的写法 -->
            <div :class="{bg1:true,co1:true}">对象的写法</div>

            <!-- 5. 最后的补充 ,:class和class同时存在-->
            <div class="bg1" :class="flag1 ? 'co2':'co1' ">:class和class同时存在</div>
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                classNam1:'bg1',
                flag1:true
            },
            methods: {
            }
        })
    </script>
</body>

</html>
  • style
 <div id="app">
        <div :style="{background:'blue',fontSize:'70px'}">aaaa</div>
        <div :style="{background:'blue','font-size':'70px'}">aaaa</div>
        <div :style=" style1 ">aaaa</div>
    </div>
    <script src="vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                style1:{background:'blue','font-size':'70px'}
            },
            methods: {
            }
        })
    </script>

一次性绑定

v-once

 <input type="text" name="" id="" v-model="username">
        <div>{{username}}</div>
        <div v-once>{{username}}</div>

优化

  • 一般情况下不要将v-for和v-if一起使用, 因为v-for的优先级高于v-if:指的是不要放在一个标签上

  • 如使用v-if则写在模板标签,使用模板标签包裹v-for标签 template(模板标签,不会被浏览器所解析)

  • v-cloak 指令:配合css样式优化我们的闪屏。

购物车案例

案例:

<style>
 [v-cloak]{
            display: none;
        }
</style>
<div id="app" v-cloak>
<template v-if="shoppingProducts.length > 0" >
    <tr v-for="(item,index) in shoppingProducts">
        <td><input type="checkbox" v-model="item.isChecked"></td>
        <td>{{item.id}}</td>
        <td>{{item.title}}</td>
        <td>
            <img width="70" :src="item.img"
                 alt="">
        </td>
        <td>{{item.price1}}</td>
        <td>
            <button @click="minus( index )">-</button>
            {{item.shoppingnum}}
            <button @click="item.shoppingnum++">+</button>
        </td>
        <td>{{item.price1 * item.shoppingnum}}</td>
        <td><button>删除</button></td>
    </tr>
    </template>
    <tr v-else>
        <td colspan="8">空空如也</td>
    </tr>
</div>

面试题

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

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

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。

错误

模板语法 {{ }},只写一行代码

不要挂载到body和html上

data和methods要写对。

methods的方法不要写箭头函数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值