vue之表单控制&购物车案例&v-model进阶&与后端交互的三种方式&电影小案例&箭头函数&js中的5种循环

发布时间 2023-06-07 15:11:27作者: 雀雀飞了

1.表单控制

<!--1 表单控制start-->
<div id="formcontrol">
    <!--    form表单标签可以不用写,因为做了数据的双向绑定-->
    <h1>?checkbox单选就是true和false?</h1>
    <p>用户名:<input type="text" v-model="name"></p>
    <p>密码:<input type="password" v-model="pwd"></p>
    <p>记住密码:<input type="checkbox" v-model="remember"></p>
    <hr>
    name---->{{name}},pwd---->{{pwd}},remember--->{{remember}}
    <h1>?checkbox多选就是选value,v-model是数组?</h1>
    <p>爱好:
        唱<input type="checkbox" v-model="hobby" value="1">
        跳<input type="checkbox" v-model="hobby" value="2">
        rap<input type="checkbox" v-model="hobby" value="3"></p>
    <hr>
    hobby--->{{hobby}}
    <h1>?radio单选也是选value,v-model是字符串?</h1>
    <p>性别:
        男:<input type="radio" v-model="gender" value="1">
        女:<input type="radio" v-model="gender" value="2"></p>
    <hr>
    gender--->{{gender}}


</div>
<!--表单控制end-->
// 表单控制start
let vm1 = new Vue({
    el: '#formcontrol',
    data: {
        name: '',
        pwd: '',
        remember: true,
        hobby: [],
        gender: '',

    },
    method: {}
})
// 表单控制end

2.购物车案例

<!--2 购物车案例start-->
<div id="shoppingcar">
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <h1 class="text-success text-center">购物车</h1>
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>price</th>
                        <th>number</th>
                        <th>operation all/null <input type="checkbox" v-model="choice" @change="handleCheck"></th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr v-for="good in good_list">
                        <th scope="row">{{good.id}}</th>
                        <td>{{good.name}}</td>
                        <td>{{good.price}}</td>
                        <td>
                            <button @click="handleReduce(good)" class="btn btn-prev">-</button>
                            {{good.number}}
                            <button @click="good.number++" class="btn btn-next">+</button>
                        </td>
                        <!--?属性指令绑定每一个对象至value?-->
                        <td>
                            <input type="checkbox" :value="good" v-model="checkGroup" @change="handleChangeSingle">
                            <button class="btn btn-danger pull-right" @click="handleDelete(good)">删除</button>
                         <!--这里删除有问题,刷新后会恢复原样,而且删除后数组内index会发生变化--> 
                        </td>
                    </tr>
                    </tbody>
                </table>
                <hr>
                选中了:{{checkGroup}}
                <h3>总价格:{{getPrice()}}</h3>
                <h3>?选中了checkbox,checkGroup会发生变化,页面也在变,都会重新刷新页面,函数就会重新执行?</h3>
            </div>
        </div>
    </div>
</div>
<!--2 购物车案例end-->
// 购物车案例start

let vm2 = new Vue({
    el: '#shoppingcar',
    data: {
        good_list: [
            {id: 1, name: '钢笔', price: 12, number: 2},
            {id: 2, name: '脸盆', price: 20, number: 20},
            {id: 3, name: '毛笔', price: 6, number: 9},
            {id: 4, name: '圆珠笔', price: 8, number: 5},
            {id: 5, name: '铅笔', price: 1, number: 3},],
        checkGroup: [],
        choice: false,
    },
    methods: {
        getPrice() {
            // 1 根据checkGroup选中的,计算
            // 2 循环checkGroup,拿出价格*数量,累加,最后返回
            let total = 0
            for (count of this.checkGroup) {
                total += count.price * count.number
            }
            return total
        },
        // 全选中:对钩都打上,js中得含义是:checkGroup变量满值
        handleCheck() {
            if (this.choice) {
                this.checkGroup = this.good_list
            } else {
                this.checkGroup = []
            }
        },
        // 判断 checkGroup的长度,是否等于good_list长度
        handleChangeSingle() {
            if (this.checkGroup.length == this.good_list) {
                this.choice = true
            } else {
                this.choice = false
            }
        },
        handleReduce(good) {
            if (good.number > 1) {
                good.number--
            } else {
                alert('不能再减了')
            }
        },
        handleDelete(good) {
            // var list = this.good_list.splice(good.id-1,1)


        }
    },
})

// 购物车案例end

3.v-model进阶

<!--3 v-model进阶start-->
<div>
    <span>v-model修饰符 之 lazy、number、trim</span>
    <h4>v-model.lazy:等待input框的数据绑定时区焦点之后再变化,节约效率</h4>
    <h4>v-model.number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留</h4>
    <h4>v-model.trim:去除首尾的空格</h4>
</div>
<!--3 v-model进阶end-->

4.与后端交互的三种方式

<!--4 与后端交互三种方式start-->
<!--ajax不是jquery函数,是异步的xml和json,核心:使用js发送http请求,接收返回-->
<div id="app">
    <!--    -原生js,可以开启ajax,但是原生js开启,比较麻烦,需要做浏览器兼容,有坑(基本不写)-->
    <!--    -jq,写了个兼容所有浏览器的 $.ajax(),不仅仅有ajax,还封装了很多dom操作,如果vue中使用它,不合适,vue就是屏蔽dom-->
    <!--    -axios:第三方的ajax包(咱们用)-->
    <!--    -fetch: 原生js发送ajax请求,有的浏览器也不兼容-->
    <button @click="handleLoad">加载数据</button>
    <button @click="handleLoad1">axios加载数据</button>
    <hr>
    username:{{username}},age:{{age}}
</div>
<!--4 与后端交互三种方式end-->

前端

// 与后端交互的3种方式start
let vm4 = new Vue({
    el: "#app",
    data: {
        username: '',
        age: '',
    },
    methods: {
        handleLoad() {
            // 请求发送成功,后端执行了,但是被浏览器拦截了,因为有跨域问题,解决方法是往请求头中加headers = {'Access-Control-Allow-Origin': '*'}
            // 当前地址,如果向非浏览器地址栏中得地址发送请求,就会出现跨域
            // 1 ajax请求方式 1    jquery的ajax
            $.ajax({
                url: 'http://127.0.0.1:8000/test/',
                type: 'get',
                success: data => {
                    console.log(typeof data)
                    var res = JSON.parse(data)
                    this.username = res.name
                    this.age = res.age

                }
            }),
             // 2 使用js原生的fetch(目前也不用)
             fetch('http://127.0.0.1:8000/test/').then(res => res.json()).then(res => {
                    console.log(res) // {name: 'queque', age: 66}是一个对象
                })
        },
        // 3 使用axios(以后用这个
        // http://www.axios-js.com/zh-cn/docs/
        handleLoad1() {
            axios.get('http://127.0.0.1:8000/test/').then(res=> {
                console.log(res.data)
                this.username = res.data.name
                this.age = res.data.age})
            }
        }



})

// 与后端交互的3种方式end

后端

# 视图
def test(request):
    name = 'queque'
    age = 66
    data = {'name': name, 'age': age}
    response = HttpResponse(json.dumps(data))
    response['Access-Control-Allow-Origin'] = '*'
    return response
 
# 路由
urlpatterns = [
    path('test/', views.test),
]

5.电影小案例

前期准备

1 去网站找素材:https://m.maizuo.com/v5/#/films/nowPlaying
2 在网页中翻动页面的时候--》network--》gateway?cityId=310100&pageNum=2&pageSize=10&type=1&k=9236189--》response--》copy all
3 去网站:https://www.json.cn/---》得到json格式数据
4 在python中新建一个Django项目,建立一个新文件film.json,将数据粘贴至文件中
 

后端

# 路由
urlpatterns = [
    path('film/', views.film),
]

# 视图
def film(request):
    with open('movies.json','rt',encoding='utf-8') as f:
        movie = json.load(f)
    movie_str = json.dumps(movie)
    response = HttpResponse(movie_str)
    # 在使用HttpResponse将movie对象转换为HTTP响应时,movie对象是一个Python对象,而不是一个字符串。因此,需要将其转换为字符串。
    response['Access-Control-Allow-Origin'] = '*'
    return response

前端

<!--5 小电影案例start-->
<div id="movies">
    <button @click="MovieLoad">小⚡️电影⚡️</button>
    <ul>
        <li v-for="item in movie_arr">
            <h1>{{item.name}}</h1>
            <p><img :src="item.poster" alt="" height="300px"></p>

        </li>
    </ul>
</div>
<!--5 小电影案例end-->
// 小电影案例start
let vm5 = new Vue({
    el:'#movies',
    data:{
        movie_arr:'',
    },
    methods:{
        MovieLoad(){
            axios.get('http://127.0.0.1:8000/film/').then(res=>{
                this.movie_arr=res.data.data.films
            })
        }
    }
})
// 小电影案例end

6.补充

// 补充:js中循环 start
var arr = [33, 2, 3, 4, 6, 7, 4]
// 基础for循环
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
// in的循环(不怎么用),不能接受多个参数,循环出索引,和v-for不是同一个东西
for (i in arr) {
    console.log(arr[i])
}
// of 循环  es6的语法  循环出value值
for (i of arr) {
    console.log(i)
}
// 数组的循环
arr.forEach(function (value, index) {
    console.log(index, '--', value)
})
// jq的循环 需要引入jquery
// $.each(arr, function (index, value) {
//     console.log(index, '--', value)
// })
// 补充:js中循环 end

7.箭头函数

# es6 的语法
	1 函数写法变简单
  2 箭头函数没有自己的this,在箭头函数中使用this,就是它上一层的
    
    
    
//  箭头函数
    //1 无参数,无返回值,不能省略括号
    // var f =function (){
    //     console.log('我是匿名函数')
    // }
    // var f = () => {
    //     console.log('我是匿名函数')
    // }
    // f()

    //2 有一个参数,没有返回值  ,可以省略括号
    // var f = function (name) {
    //     console.log('我是匿名函数',name)
    // }
    // var f = name => {
    //     console.log('我是匿名函数', name)
    // }
    // f('Lqz')
    //3 多个参数,不能省略括号
    // var f = (name, age) => {
    //     console.log('我是匿名函数', name, age)
    // }
    // f('Lqz', 19)

    //4 多个参数,不能省略括号,一个返回值
    // var f = (name, age) => {
    //     return name + 'nb'
    // }


    // 简写成  省了return和大括号
    // var f = (name, age) => name + 'nb'
    // var res=f('Lqz', 19)
    // console.log(res)


    // 5 一个参数,一个返回值
    // var f = name => name + 'nb'
    // var res = f('Lqz')
    // console.log(res)

8.所需cdn

<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <script src="./vue/vue.js"></script>
    <script src="https://code.jquery.com/jquery-3.7.0.min.js"
            integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

9.思考

Python的参数传递是值传递还是引用传递