Vue基操日常

336 阅读5分钟

Vue.js

先遣练习

题目:【使用Vue实现新浪新闻首页Tab切换效果】

效果图: 可在新浪首页 (sina.com.cn)查看效果

Snipaste_2021-10-10_19-36-30.png

1.v-bind

前面我们都是通过指令来将值插入到我们的标签内容中,但除了内容外,我们还需要动态绑定某些属性,比如:a标签中的href属性,img标签中的src属性;这个时候我们就可以使用v-bind指令,它的作用就是可以动态绑定属性。

小技巧:v-bind简写 例如: v-bind:class -- :class v-bind:href -- :href v-bind:value -- :value ...

1.1、Type绑定

<div id="app">
    <a :href="hrf">{{text}}</a>
    <button @click="goSina">更换到{{text}}的其他链接</button>
</div>
new Vue({
    el: "#app",
    data: {
        hrf: 'http://baidu.com',
        text:'百度'
    }
    , methods: {
        goSina() {
            this.hrf = "http://sina.com.cn",
            this.text='新浪'
        }
    }
})

1.2、Class绑定

<div id="app">
    <p :class="{'blue':isBlue}">我是蓝色的字 - 绑定类名</p>
    <p :class="{'blue':isBlue,'italic':isItalic}">我是蓝色又倾斜的字 - 多个类名</p>
    <p :class="isBlue?'blue':''">我是蓝色又倾斜的字 - 三元</p>
    <p :class="isBlue&&isItalic?'blue italic':''">我是蓝色又倾斜的字 - 三元扩展</p>
    <p :class="['blue','italic']">我是蓝色又倾斜的字 - 数组</p>
    <p :class="addClass()">函数返回类名</p>
</div>
new Vue({
    el: "#app",
    data: {      
        isBlue: true,
        isItalic: true,
    },
    methods: {
        addClass() {
            // return { 'blue': this.isBlue }
            // return ['blue', 'italic']
            return this.isBlue ? 'blue' : ''
        }
    }
})

1.3、Style绑定

<ul>
    <li :style="{background:bg,'color':'blue'}">我是li</li>
    <li style="background:blue;color:red">我是li</li>
    <li :style="{background:bg,'color':Color}">我是li</li>
    <li :style="allBg">我是li</li>
    <li :style="allColor">我是li </li>
    <li :style="[allBg,allColor]">我是li - 数组</li>
    <li :style="addStyle()">我是li - 函数返回</li>
</ul>
let vm = new Vue({
    el: "#app",
    data: {
        bg: 'pink',
        Color: 'red',
        allBg: { background: 'red', color: 'yellow' },
        allColor: { fontStyle: 'italic' }
    },
    methods: {
        addStyle() {
            return [this.allBg, this.allColor]
        }
    }
})

2.v-for

<div id="app">
    <ul>
        <!--使用index作为key-->
        <!-- <li v-for="(item,index) in arr" :key="index">
            {{index}} - {{item.name}} 
            <input type="text">
        </li> -->
        
        <!--使用id作为key-->
        <li v-for="item in arr" :key="item.id">
            {{item.name}} 
        <input type="text"></li>
    </ul>
    <button @click="addArr">添加内容</button>
</div>
new Vue({
    el: "#app",
    data: {
        // arr: ['a', 'b', 'c']
        arr: [{ id: 1, name: 'a' }, { id: 2, name: 'b' }, { id: 3, name: 'c' }]
    }
    , methods: {
        addArr() {
            this.arr.unshift({ id: 3, name: 'd' })
        }
    }

小节: 为什么key要尽量使用id而不是index key作为唯一标识符,如果选用index就失去唯一性 使用index 在数组发生改变的时候 他自己也会发生变化 失去唯一性 尽量不要使用index 作为key 总结: 当数组不发生改变时(一次性渲染),key可以选择index 或者id 当数组会改变时,会引起html重排,不要使用index,最好选择id作为key

3.computed -- 计算属性

3.1、为什么会有(computed)计算属性

因为vue的使用中data中的数据是不能互相调用的所以有了computed这个属性, computed属性(计算属性)用来实现实现 结构拼接 或者 数据合并

3.2、computed属性与methods的区别

computed是属性调用,methods是方法调用 computed有缓存功能,多次使用时,该属性只会触发一次调用,而methods是使用一次就触发一次

 <div id="app">
     <ul>
         <li>名:{{firstName}}</li>
         <li>性:{{lastName}}</li>
         <!-- 执行一次  因为 computed有缓存 -->
         <li>姓名 {{username}}</li>
         <li>姓名 {{username}}</li>
         <!-- 执行多次  因为 methods没有缓存 -->
         <li>姓名 {{username1()}}</li>
         <li>姓名 {{username1()}}</li>
     </ul>
 </div>
new Vue({
    el: "#app",
    data: {
        firstName: 'Michael',
        lastName: 'Jackson'
    },
    // 执行一次  因为 computed有缓存
    computed: {
        username() {
            console.log('computed');
            return this.firstName + ' ' + this.lastName
        }
    },
    // 执行多次  因为 methods没有缓存
    methods: {
        username1() {
            console.log('methods');
            return this.firstName + ' ' + this.lastName
        }
    },
})

4.v-model -- 语法糖详解

4.1、下拉框案例

<div id="app">
    <select name="" id="" v-model="result">
        <option value="apple">苹果</option>
        <option value="banana">香蕉</option>
        <option value="orange">橘子</option>
    </select>
</div>
new Vue({
    el: "#app",
    data: {
        result: 'orange'
    }
})

4.2、解析v-model -- 双向绑定

v-model 其实是个语法糖(方便简写代码的语法) 它背后本质上包含了两个操作: v-bind 绑定input元素的value属性 v-on 指令绑定input元素的input事件

4.2.1、v-model语法糖
<input type="text" v-model="text">
<h1>{{text}}</h1>
new Vue({
    el: "#app",
    data: {
        text: 'hello word !'
    }
})
4.2.2、拆分v-model
<input type="text" :value="text" @input="addText">
<h1>{{text}}</h1>
new Vue({
    el: "#app",
    data: {
        text: 'hello word !'
    },
    methods: {
        //事件源
         addText(e) {
             console.log(e); 
             this.text = e.target.value
         }
    }
})
4.2.3、一行完成双向绑定
<input type="text" :value="text" @input="text=$event.target.value">
<h1>{{text}}</h1>
new Vue({
    el: "#app",
    data: {
        text: 'hello word !'
    }
})

5.过滤器

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 ( 后者从 2.1.0+ 开始支持 )。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:

例如: 格式化价格

5.1、全局过滤器

<div id="app">
    <p>{{price | filterMoney}}</p>
</div>
Vue.filter('filterMoney', (num) => {
    // toFixed(n)方法保留多少位小数
    return '¥' + num.toFixed(2) + ' 元'
})
new Vue({
    el: "#app",
    data: {
        price: 21.9
    }
})

5.2、局部过滤器

局部过滤器 , 凡是 有全局又有局部的 局部使用后面都要加给s --- filter(全局) filters(局部)

<div id="app">
    <p>{{price | filterMoney}}</p>
</div>
new Vue({
    el: "#app",
    data: {
        price: 22.9
    },
    filters:{
        filterMoney(num){
            return '¥' + num.toFixed(2) + ' 元'
        }
    }
})

5.3、过滤器的使用场景

<div id="app">{{price | Mony}}</div>
<div id="app1">{{price |Mony}}</div>

当两个 都要使用过滤器并且使用的方法都一样时可以使用全局过滤器

Vue.filter('Mony', (num) => {
    return '¥' + num.toFixed(2) + '元'
})
new Vue({
    el: "#app",
    data: {
        price: 20.3
    }
})
new Vue({
    el: "#app1",
    data: {
        price: 50.9
    }
})

6.本地存储

6.1、永久存储

// 添加数据;setItem的value值是字符串类型的数据
 	localStorage.setItem('name', value)
// 获取数据
	localStorage.getItem('name');
//删除数据
 	localStorage.removeItem('name')
// 清空
	localStorage.clear();

6.2、暂存


// 添加数据;setItem的value值是字符串类型的数据
	sessionStorage.setItem('name',value);
// 获取数据
	sessionStorage.getItem('name'); 
//删除数据
 	sessionStorage.removeItem('name')
// 清空
	sessionStorage.clear();

6.3、cookie

cookie: 网站中,http请求时无状态的。也就是第一次登陆成功(发送请求),第二次请求服务器依然不知道是哪一个用户。这时候的cookie就是解决这个问题的,第一次登陆后服务器返回数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求,浏览器自动会把上次请求存储的cookie数据自动带上给服务器,服务器根据客户端的cookie来判断当前是哪一个用户。cookie存储有大小限制,不同浏览器不一样,一般是4kb,所以cookie只能存储小量数据。

4kb = 4 * 1024 byte (字节) = 4 * 1024 * 8 bit(位)

服务器会把第一次登陆后服务器返回的cookie存储到浏览器中

发一个请求给后端(自动带上第一次登陆后的cookie),拿回我自己购物车的列表

服务端接收到这个请求后,根据浏览器带上的cookie做出判断,判断当前是哪一个用户

session: session和cookie的作用有点类似,也是存储用户相关信息。不同的是cookie存储在浏览器,而session存储在服务器。