前端开发之Vue框架

一、购物车案例

1、基本购物车

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购物车案例</title>
    <script src="../js/vue.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div>
    <div class="app">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <h1 class="text-center">购物车案例</h1>
                    <table class="table table-hover">
                        <thead>
                        <tr>
                            <th>编号</th>
                            <th>商品名</th>
                            <th>单价</th>
                            <th>数量</th>
                            <th>选择</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr v-for="goodsObj in goodsList">
                            <th scope="row">{{goodsObj.id}}</th>
                            <td>{{goodsObj.name}}</td>
                            <td>{{goodsObj.price}}</td>
                            <td>{{goodsObj.count}}</td>
                            <td>
                                <input type="checkbox" v-model="isChoice" :value="goodsObj">
                            </td>
                        </tr>
                        </tbody>
                    </table>
                    <hr>
                    {{isChoice}}
                    <br>
                    {{handleInput()}}

                </div>
            </div>

        </div>


    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            isChoice: [],
            goodsList: [
                {id: 1, name: '笔记本电脑', price: 2000, count: 1, stock: 5},
                {id: 2, name: '苹果手机', price: 4000, count: 1, stock: 10},
                {id: 3, name: '键盘', price: 800, count: 1, stock: 2},
                {id: 4, name: '鼠标', price: 200, count: 1, stock: 8},
                {id: 5, name: '蓝牙耳机', price: 500, count: 1, stock: 5},
            ]
        },
        methods: {
            handleInput() {
                var total = 0
                for (item of this.isChoice) {
                    total += item.price * item.count
                }
                return total
            }
        }
    })


</script>
</html>

2、购物车-优化

  • 优化功能
    • 增加/减少商品
    • 删除商品
    • 商品全选/全不选功能
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购物车案例</title>
    <script src="../js/vue.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div>
    <div class="app">
        <div class="container-fluid">
            <div class="row">
                <div class="col-md-6 col-md-offset-3">
                    <h1 class="text-center">购物车案例</h1>
                    <table class="table table-hover">
                        <thead>
                        <tr>
                            <th class="text-center">编号</th>
                            <th class="text-center">商品名</th>
                            <th class="text-center">单价</th>
                            <th class="text-center">数量</th>
                            <th class="text-center">
                                全选/全不选
                                <input type="checkbox" v-model="choiceAll" @change="handleAll">
                            </th>
                            <th class="text-center">库存</th>
                            <th class="text-center">编辑</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr v-for="(goodsObj,index) in goodsList" class="text-center">
                            <th scope="row">{{goodsObj.id}}</th>
                            <td>{{goodsObj.name}}</td>
                            <td>{{goodsObj.price}}</td>
                            <td>
                                <button class="btn btn-link" @click="handleClickUp(goodsObj)">+</button>
                                {{goodsObj.count}}
                                <button class="btn btn-link" @click="handleClickDown(goodsObj)">-</button>
                            </td>
                            <td>
                                <input type="checkbox" v-model="choiceList" :value="goodsObj" @change="handleClick">
                            </td>
                            <td>
                                {{goodsObj.stock}}
                            </td>
                            <td>
                                <button class="btn btn-group btn-danger" @click="handleDel(index)">移除</button>
                            </td>
                        </tr>
                        </tbody>
                    </table>
                    <span>总价:</span>
                    {{handleInput()}}
                    <hr>
                    已选商品:
                    <br>
                    {{choiceList}}
                    <br>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            choiceList: [],
            choiceAll: false,
            goodsList: [
                {id: 1, name: '笔记本电脑', price: 2000, count: 1, stock: 5},
                {id: 2, name: '苹果手机', price: 4000, count: 1, stock: 10},
                {id: 3, name: '键盘', price: 800, count: 1, stock: 2},
                {id: 4, name: '鼠标', price: 200, count: 1, stock: 8},
                {id: 5, name: '蓝牙耳机', price: 500, count: 1, stock: 5},
            ],
        },
        methods: {
            // 统计价格
            handleInput() {
                var total = 0
                for (item of this.choiceList) {
                    total += item.price * item.count
                }
                return total
            },
            // 全选/全不选
            handleAll() {
                if (this.choiceAll) {
                    this.choiceList = this.goodsList
                } else {
                    this.choiceList = []
                }
            },
            // 全选/全不选 功能优化
            handleClick() {
                if (this.choiceList.length === this.goodsList.length) {
                    this.choiceAll = true
                } else {
                    this.choiceAll = false
                }
            },
            // 添加商品数量
            handleClickUp(goodsObj) {
                if (goodsObj.count < goodsObj.stock) {
                    goodsObj.count++
                } else {
                    alert('商品库存不足,无法在添加啦')
                }

            },
            // 减少商品
            handleClickDown(goodsObj) {
                if (goodsObj.count > 1) {
                    goodsObj.count--
                } else {
                    alert('宝宝!再减就没有啦')
                }
            },
            // 移除商品
            handleDel(index) {
                if (confirm('宝宝!你真的不要我了吗')) {
                    this.goodsList.splice(index, 1)
                }
            }
        }
    })
</script>
</html>

二、v-model进阶操作

方法 描述
lazy 等待input框的数据绑定时区焦点之后再变化
number 数字开头,只保留数字,后面的字母不保留;字母开头,都保留
trim 去除首尾的空格

代码用法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-model进阶操作</title>
    <script src="../js/vue.js"></script>
</head>
<body>
<div>
    <div class="app">
        <h1>lazy方法:</h1>
        <input type="text" v-model.lazy="data_lazy">----->{{data_lazy}}
        <h1>number方法</h1>
        <input type="text" v-model.number="data_number">----->{{data_number}}
        <h1>trim方法</h1>
        <input type="text" v-model.trim="data_trim">----->{{data_trim}}
    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data:{
            data_lazy:'',
            data_number:'',
            data_trim:'',
        }
    })
</script>
</html>

三、与后端交互

1、jqery对象的ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>与后端交互</title>
    <script src="../js/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
</head>
<body>
<div>
    <div id="app">
        <button @click="handleClick">点击展示用户数据</button>
        <div v-if="userInfo">
            <p>姓名:{{userInfo.name}}</p>
            <p>年龄:{{userInfo.age}}</p>
            <p>性别:{{userInfo.gender}}</p>
            <p>爱好:{{userInfo.hobby}}</p>
        </div>
        <div v-else>
            <span>暂无用户信息</span>
        </div>

    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            userInfo: '',
        },
        methods: {
            handleClick() {
                $.ajax({
                    url: 'http://127.0.0.1:8000/index/',
                    type: 'get',
                    success: data => {
                        this.userInfo = data
                    }
                })
            }
        }
    })
</script>
</html>

2、fetch发送ajax请求

​ fetch 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应

  • 新的发送ajax 接口
  • 用起来比较方便
  • 支持promise写法[最新的异步写法]
  • 解决了原生的XMLHttpRequest兼容性的问题
  • 不是所有浏览器都支持
  • 主流现在是用axios[第三方]发送请求

XMLHttpRequest: 原生js提供的

  • 比较老,不同浏览器需要做一些兼容性的处理,写起来比较麻烦
  • jq基于它做了封装
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>与后端交互</title>
    <script src="../js/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
</head>
<body>
<div>
    <div id="app">
        <button @click="handleClick">点击展示用户数据</button>
        <div v-if="userInfo">
            <p>姓名:{{userInfo.name}}</p>
            <p>年龄:{{userInfo.age}}</p>
            <p>性别:{{userInfo.gender}}</p>
            <p>爱好:{{userInfo.hobby}}</p>
        </div>
        <div v-else>
            <span>暂无用户信息</span>
        </div>

    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            userInfo: '',
        },
        methods: {
            handleClick() {
                fetch('http://127.0.0.1:8000/index/').then(response => response.json()).then(res => {
                    this.userInfo = res
                })
            }
        }
    })
</script>
</html>

3、axios发送ajax请求

简介:

  • 在vue上 ,第三方的模块需要导入才能使用

  • Axios 是一个基于 promise 的 HTTP 库,还是基于XMLHttpRequest封装的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>与后端交互</title>
    <script src="../js/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

</head>
<body>
<div>
    <div id="app">
        <button @click="handleClick">点击展示用户数据</button>
        <div v-if="userInfo">
            <p>姓名:{{userInfo.name}}</p>
            <p>年龄:{{userInfo.age}}</p>
            <p>性别:{{userInfo.gender}}</p>
            <p>爱好:{{userInfo.hobby}}</p>
        </div>
        <div v-else>
            <span>暂无用户信息</span>
        </div>

    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            userInfo: '',
        },
        methods: {
            handleClick() {
 axios.get("http://127.0.0.1:8000/index/").then(res => {
                    this.userInfo = res.data
                })
            }
        }
    })
</script>
</html>

4、展示热播电影

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>与后端交互</title>
    <script src="../js/vue.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

</head>
<body>
<div>
    <div id="app">
        <button @click="handleClick">点击展示用户数据</button>

        <div v-for="item in dataList">
            <div>
                <h1>{{item.name}}</h1>
                <h3>导演:{{item.director}}</h3>
                <h3>类型:{{item.category}}</h3>
                <p>简介:{{item.synopsis}}</p>

                <img :src="item.poster" alt="" width="200px">

            </div>
        </div>
    </div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            userInfo: '',
            dataList: ''
        },
        methods: {
            handleClick() {
                axios.get("http://127.0.0.1:8000/index/").then(res => {
                    this.dataList = res.data.data.films
                })
            }
        }
    })
</script>
</html>