欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

程序员文章站 2022-05-29 23:12:35
...

目   录

1、Vue表单

原生JS实现异步表单提交

运行截图

代码

核心指令

单选框、密码框、多行文本框

单选

多选

勾选

下拉列表(每个option标签都要有value值)

组件汇总案例

运行截图

代码

ToDoList案例

JS堆栈内存图

运行截图

代码

2、计算属性(对data中的数据进行加工处理)

实现

computed-案例

运行截图

代码

3、watch监听(监听data中数据变化)

实现

案例

运行截图

代码


1、Vue表单

Vue.js表单 是 双向数据绑定的。

原生JS实现异步表单提交

运行截图

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>01、原生JS实现异步表单提交</title>
</head>

<body>
    <!-- 如果是异步提交,就可以不需要使用form标签 -->
    <p>姓名: <input type="text"> </p>
    <p>密码: <input type="password"></p>
    <button>提交</button>

    <!-- 传统同步模式 action:服务器处理地址-->
    <form action="">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit">
    </form>
</body>
<script>
    var btn = document.getElementsByTagName("button")[0];
    var ipt = document.getElementsByTagName("input");
    btn.onclick = function () {
        console.log(ipt[0].value)
        console.log(ipt[1].value)
    }
    // 如果字段多, 获取字段值很麻烦,且 数据回显
</script>

</html>

核心指令

<标签控件 v-model="变量" />

单选框、密码框、多行文本框

<input type="text" v-model="变量" />

<input type="password" v-model="变量" />

<textarea v-model="变量"></textarea>

单选

变量获取到的数据就是控件的value值,如果变量绑定的数据和控件的value值⼀致,则 该单选控件 被选中。

<input type="radio" v-model="变量" value="值1" />
<input type="radio" v-model="变量" value="值2" />
<input type="radio" v-model="变量" value="值3" />

data:{
    变量:值2 // 值2的控件将会被选中
}

多选

<input type="checkbox" v-model="变量" value="值1" />
<input type="checkbox" v-model="变量" value="值2" />
<input type="checkbox" v-model="变量" value="值3" />

data:{
    变量:[值1] // 绑定的变量是⼀个数组! 值1的控件将会选中
}

勾选

<input type="checkbox" v-model="变量" />

data:{
    变量:布尔值
}

下拉列表每个option标签都要有value值

<select v-model="变量">
     <option value="值1">111</option>
     <option value="值2">222</option>
     <option value="值3">333</option>
</select>

data:{
    变量:值2 // 值2的option控件被选中
}

组件汇总案例

运行截图

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>02、Vue表单</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="app">
        <p>姓名:<input type="text" v-model="userinfo.username">{{userinfo.username}}</p>
        <p>密码:<input type="password" v-model="userinfo.password">{{userinfo.password}}</p>
        <p>
            性别:
            <!-- 作为单选控件的时候,需要给每个控件一个 value值! -->
            <label><input type="radio" value="1" v-model="userinfo.sex">男</label>
            <label><input type="radio" value="0" v-model="userinfo.sex">女</label>
            {{userinfo.sex}}
        </p>
        <p>
            爱好:
            <!-- 作多选的时候,每个多选控件,也需要有value值,作为提交的数据  -->
            <label><input type="checkbox" value="lq" v-model="userinfo.ah">篮球</label>
            <label><input type="checkbox" value="zq" v-model="userinfo.ah">足球</label>
            <label><input type="checkbox" value="ymq" v-model="userinfo.ah">羽毛球</label>
            <label><input type="checkbox" value="pq" v-model="userinfo.ah">皮球</label>
            {{userinfo.ah}}
        </p>
        <p>
            是否同意协议:
            <!-- 作勾选的时候,绑定的变量只需要是一个布尔值即可! -->
            <label><input type="checkbox" v-model="userinfo.agree">xxxxx协议内容,是否同意</label>
            {{userinfo.agree}}
        </p>
        <p>
            家乡:
            <!-- 多选,每个option都绑定上一个value -->
            <select v-model="userinfo.city">
                <option value="">==请选择==</option>
                <option value="zhengzhou">郑州</option>
                <option value="nanying">南阳</option>
                <option value="anyang">安阳</option>
                <option value="xinyang">信阳</option>
                <option value="luoyang">洛阳</option>
            </select>
            {{userinfo.city}}
        </p>
        <p>
            留言:
            <textarea v-model="userinfo.note"></textarea>
            {{userinfo.note}}
        </p>
        <button @click="reg">提交</button>
    </div>
</body>
<script>
    // 核心指令内容: v-model    
    // vue.js 受欢迎的原因就在于表单的双向数据绑定!
    new Vue({
        el: "#app",
        data: {
            userinfo: {
                username: "1",
                password: "2",
                sex: 1,   // 1 男  0  女
                ah: ['zq', 'pq'],   // 如果多选的话,绑定需要是一个数组
                agree: false,
                city: "",
                note: ""
            }
        },
        methods: {
            reg() {
                console.log("要去注册了")
                console.log(this.userinfo)
            }
        }
    })
    // 获取表单数据 变得简单了!
    // 从表单获取数据---赋值--->userinfo.username
</script>

</html>

ToDoList案例

JS堆栈内存图

  1. 基本数据类型  字符串、数字、布尔值、null、undefined   栈内存
  2. 引用数据类型  object/array           堆内存

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

运行截图

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>03、ToDoList</title>
    <script src="vue.js"></script>
    <style>
        #app {
            text-align: center;
        }

        .form {
            background-color: orange;
            padding: 20px;
            display: inline-block;
            border-radius: 5px;
        }

        .table,
        td,
        th {
            border: 1px solid orange;
            width: 900px;
            margin: 30px auto;
        }

        td,
        th {
            padding: 5px;
        }

        .bg {
            background-color: orange;
            color: #fff;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="form">
            主题:<input type="text" v-model="item.title">
            地点:<input type="text" v-model="item.pos">
            时间:<input type="date" v-model="item.time">
            <button @click="submitAdd" v-if="act=='add'">提交</button>
            <button @click="submitEdit" v-if="act=='edit'">修改</button>
        </div>

        <table class="table">
            <tr class="top">
                <th>序号</th>
                <th>主题</th>
                <th>地点</th>
                <th>时间</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            <template v-if="list.length">
                <!-- v-if、v-for 不能同时在一个标签内。 
                 template : 辅助功能,无渲染效果。 -->
                <tr v-for="(val, idx) in list" :class="val.status ? 'bg':'' ">
                    <td>{{idx+1}}</td>
                    <td>{{val.title}}</td>
                    <td>{{val.pos}}</td>
                    <td>{{val.time}}</td>
                    <td>{{val.status ? '完成':'未完成'}}</td>
                    <td>
                        <button @click="finish(val)" v-if="val.status==0">完成</button>
                        <button @click="edit(val, idx)">修改</button>
                        <button @click="del(idx)">删除</button>
                    </td>
                </tr>
            </template>
            <tr v-else>
                <td colspan="6">
                    <br>
                    暂无数据
                    <br><br>
                </td>
            </tr>
        </table>
    </div>
</body>

<script>
    new Vue({
        el: "#app",
        data: {
            list: [],
            item: {
                title: "",
                pos: "",
                time: "",
                status: 0   // 0表示 未完成 ; 1表示已完成
            },
            act: "add",    // 提交的类型!
            editIdx: "",   // 修改的下标
        },
        methods: {
            submitAdd() {  // 添加提交
                if (this.item.title && this.item.pos && this.item.time) {
                    // 将数据放入到list中
                    // 拷贝一份和this.item完全一致的数据,放进去
                    // Object.assign(对象A,对象B)  将对象B合并到对象A里面去。拷贝
                    this.list.push(Object.assign({}, this.item))

                    // 数据还原!
                    this.item.title = this.item.pos = this.item.time = ""
                    this.item.status = 0;
                } else {
                    alert("请输入完整数据!")
                }
            },
            submitEdit() {  // 修改提交
                if (this.item.title && this.item.pos && this.item.time) {
                    let newdata = Object.assign({}, this.item);
                    // 找修改的那个下标,将新的数据替换了!
                    console.log(this.editIdx)
                    this.list[this.editIdx] = newdata;

                    // 数据还原!
                    this.item.title = this.item.pos = this.item.time = ""
                    this.item.status = 0;
                    this.act = "add"
                    this.editIdx = ""
                } else {
                    alert("请输入完整数据!")
                }
            },
            finish(v) {
                v.status = 1;
            },
            edit(v, i) {
                console.log(v)
                console.log(i)
                this.editIdx = i;  // 将下标放在data里面的editIdx变量!
                this.act = "edit"
                this.item = Object.assign({}, v);  // 数据回显!
            },
            del(i) {
                this.list.splice(i, 1) // 删除数据
            }
        }
    })

    
    /////////////   引用数据类型的特点   //////////////
    var aa = 20;
    var bb = aa;
    bb += 20;
    console.log(aa)  // 20
    console.log(bb)  // 40


    var p1 = {
        name: "张飞",
        age: 20
    }
    var p2 = p1; // 引用地址
    p2.age += 10;
    console.log(p1.age)   //  30
    console.log(p2.age)   //  30

// JS
    // 基本数据类型  字符串、数字、布尔值、null、undefined   栈内存
    // 引用数据类型  object/array           堆内存
</script>

</html>

2、计算属性(对data中的数据进行加工处理)

实现

计算属性的值为函数,且这个函数需要返回值!

将数据处理好之后,赋给全局变量,再进行显示。

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

new Vue({
    el: "",
    data: {},
    computed: {
        属性名: function(){
            return xxx;
        }
    }
})

computed-计算属性案例

运行截图

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>04、计算属性</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="app">
        {{abc}}
        <br>
        {{money}}
        <hr>
        {{"¥"+num}}
    </div>
</body>
<script>
    // 计算属性
    // 计算     属性  
    // 动词     名词   语文角度

    // 计算属性本质是属性! 只不过需要计算得到!
    let vm = new Vue({
        el: "#app",
        data: {
            msg: "你好",
            age: 20,
            num: 2000
        },
        computed: {
            abc: function () {  // 值是一个函数,且这个函数有return返回值内容!
                return this.msg + this.age
            },
            money: function () {
                return "¥" + this.num
            }
        }
    })
    console.log(vm)    
</script>

</html>

3、watch监听(监听data中数据变化)

实现

new Vue({
    el: "",
    data: {
        变量名:值
    },
    watch: {
        // 浅监听: 监听的变量数据类型是基本数据类型
        变量名: function(新值){
            ....
        }
        // 深监听: 监听的变量数据类型是引⽤数据类型
        变量名: {
            deep: true,
            handler: function(新值){
                ...
            }
        }

    }
})

案例

运行截图

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>05、watch使用</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="app">
        <span>单价是:¥10.00</span>
        <span>数量是:{{num}}</span>
        <!-- <span>小计:¥{{ num*10 }}</span> -->
        <span>小计:¥{{ total }}</span>
        <button @click="add">累加</button>
        <hr>
        {{person}}
    </div>
</body>
<script>
    // 需要一个监听者,监听某个数据的变化!
    new Vue({
        el: "#app",
        data: {
            num: 1,
            total: "10.00",
            person: {
                name: "张飞",
                age: 20
            }
        },
        methods: {
            add() {
                this.num++  // 数量变化!
                this.person.age++  // 年纪也变化!
            }
        },
        watch: {
            // 浅监听
            // 只要num发生变化,此函数将自动执行
            num: function (newval) { // 形参newnal
                console.log(newval)
                this.total = newval * 10
            },

            // 深监听-->对象
            // 无法检测变化的,因为引用地址没有变化!
            // person:function(newval){
            //     console.log(newval)
            // }
            person: {
                deep: true,
                handler: function (newval) {
                    console.log(newval)
                }
            }
        }
    })
    // 监听分类两种:
        // 浅监听:  监听的是基本数据类型!
        // 深监听:  监听的是引用数据类型!
</script>

</html>

多谢观看~