Vue——品牌案例以及v-resource改造品牌案例

品牌案例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
    <link rel="stylesheet" href="../lib/bootstrap3.3.7.css">

</head>

<body>

    <div id="app">

        <!-- 快捷键 bs3-panel -->
        <!-- 在vue中使用事件绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了 -->
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">添加品牌</h3>
            </div>
            <div class="panel-body form-inline">
                <label for="">
                    ID:
                    <input type="text" class="form-control" v-model="id">
                </label>
                <label for="">
                    Name:
                    <!-- enter回车键 -->
                    <!-- <input type="text" class="form-control" v-model="name"  @keyup.enter="add"> -->
                    <!-- 系统内置给我们提供了几个,如果不够就可以自定义  比如我要按F2添加 -->
                    <input type="text" class="form-control" v-model="name" @keyup.f2="add">
                </label>
                <!-- 不传参数add后面的括号可省略 -->
                <input type="button" value="添加" class="btn btn-primary" @click="add">
                <label for="">
                    搜索名称关键字:
                    <!-- Vue中所有的指令,在调用的时候都以v-开头,包括自定义 -->
                    <!-- 如果blue没有单引号只有双引号,就是个变量,会在date中找这个变量的值,但是Blue我们是作为参数传递进自定义指令中的,以字符串形式传递 -->
                    <input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'blue'">
                </label>
            </div>
        </div>
        <table class="table table-bordered table-hover table-striped">

            <thead>
                <tr>
                    <th>ID</th>
                    <th>name</th>
                    <th>Ctime</th>
                    <th>Operation</th>
                </tr>
            </thead>
            <tbody>
                <!-- 之前v-for中的数据,都是直接从data上的list中直接渲染过来的 现在我们自定义一个search方法,同时
            把所有的关键字通过传参的形式传递给了search方法-->
                <!-- 在search方法内部,通过执行for循环,把所有符合搜索关键字的数据,保存到一个新数组中,返回-->
                <tr v-for="item in search(keywords)" :key="item.id">
                    <td>{{item.id}}</td>
                    <td v-text="item.name">{{item.name}}</td>
                    <td>{{item.Ctime|dateFormat('')}}</td>
                    <td>
                        <!-- 加点击事件和阻止默认行为(a标签会刷新页面)   括号里传参  这个a链接属于for循环内部,所以能访问到item.id -->
                        <a href="" @click.prevent="del(item.id)">删除</a>
                    </td>
                </tr>
            </tbody>
        </table>

    </div>
    <div id="app2">
        <h3 v-color="'pink'" v-fontweight="900" v-fontsize="'50px'">{{dt|dateFormat}}</h3>
    </div>
    <script>
        //全局的过滤器,进行时间的格式化  
        //所谓的全局过滤器,就是所有的Vue实例共享的
        Vue.filter('dateFormat', function (dateStr, pattern = ' ') {
            //根据给定的时间字符串,得到特定的时间
            var dt = new Date(dateStr)
            var y = dt.getFullYear();
            var m = dt.getMonth() + 1;
            var d = dt.getDate()

            if (pattern && pattern.toLowerCase() === "yyyy-mm-dd") {
                return `${y}-${m}-${d}`
            } else {
                var hh = dt.getHours()
                var mm = dt.getMinutes()
                var ss = dt.getSeconds()
                return `${y}-${m}-${d} ${hh} :${mm}:${ss} `
            }
        })
        //系统内置给我们提供了几个,如果不够就可以自定义
        // 自定义全局按键修饰符  config是配置  keyCodes键盘码
        Vue.config.keyCodes.f2 = 113 //113是f2的码

        //定义全局指令,其中参1是指令的名称,在定义的时候,指令的名称前面不需要加前缀-  调用的时候必须在指令名称前加上v-前缀
        // 参数2是个对象  这个对象身上有一些指令相关的函数,这个函数可以在特定的阶段执行相关的操作
        // 在每个函数中,第一个参数永远是el,表示被绑定了指令的那个元素.这个el参数是一个原生的js对象
        Vue.directive('focus', {
            bind: function (el) {
                // 在元素刚绑定了指令的时候,还没有插入到DOM中,这时候调用focus方法没有作用,因为一个元素只有插入DOM之后,才能获取焦点
                //每当指令绑定到元素上el的时候,会立即执行这个函数,只执行一次 
            },
            inserted: function (el) {
                // 表示元素插入到DOM中的时候,执行这个函数,触发一次
                el.focus()
            },
            update: function (el) {
                // 当vNode更新的时候,会执行这个函数,可能会触发多次
            }

        })

        //自定义一个设置字体的颜色,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了内联的样式.不需要在Inserted  因为改变样式不需要DOM
        //和样式相关的在Bind里渲染,和js行为相关的最后在Inserted中取执行,防止js行为不生效
        /*
      钩子函数的参数有:

        el: 指令所绑定的元素,可以用来直接操作 DOM 。
    binding: 一个对象,包含以下属性:
        name: 指令名,不包括 v- 前缀。
        value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
        oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
        expression: 绑定值的表达式或变量名。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
        arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
        modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。

        */
        Vue.directive('color', {
            bind: function (el, binding) { //括号里的是形参,形参名字是什么都可以
                //上面的Input里的v-color
                // el.style.color = 'red';
                // console.log(binding.expression);
                // console.log(binding.value);
                el.style.color = binding.value


            },
            inserted: function (el) {},
            update: function (el) {}
        })
        var vm = new Vue({
            el: "#app",
            data: {
                id: '',
                name: '',
                keywords: '', //搜索关键字
                list: [{
                        id: 1,
                        name: '玛莎拉蒂',
                        Ctime: new Date()
                    },
                    {
                        id: 2,
                        name: '保时捷',
                        Ctime: new Date()
                    }
                ]

            },
            methods: {
                add() {
                    var car = {
                        id: this.id,
                        name: this.name,
                        Ctime: new Date()
                    };
                    this.list.push(car);
                    //   添加完自动清空输入框的id和name
                    this.id = this.name = '';
                },
                del(id) { //为什么这里不写item.id
                    //1.数组的some方法
                    //分析:如果根据ID,找到要删除的这一项索引,如果找到索引了,直接调用数组的splice方法
                    //在数组的some方法中,如果return true就立刻终止这个数组的后续循环
                    // this.list.some((item,i)=>{
                    //    if(item.id==id){
                    //     this.list.splice(i,1)
                    //    }
                    //    return true;
                    // })

                    //2.findIndex方法 返回索引
                    var index = this.list.findIndex(item => {
                        if (item.id == id) {
                            return true;
                        }
                    })
                    // console.log(index);
                    this.list.splice(index, 1);

                },
                search(keywords) { //根据关键字进行数据的搜索
                    //1.方法一
                    /* var newList = [];
                     this.list.forEach(item => {
                         if (item.name.indexOf(keywords) != -1) {
                             newList.push(item);
                         }

                     })
                     return newList;*/
                    //2.方法二  注意:forEach some filter  findIndex这些都属于数组的新方法,都会对数组中的每一项进行遍历,执行相关的操作,,会有一些差别
                    //各有各的用法
                    return this.list.filter(item => {
                        //ES6的新方法includes 如果包含,返回true,否则返回false
                        if (item.name.includes(keywords))
                            return item;
                    })
                }

            },

        })
        var vm2 = new Vue({
            //过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致,优先调用私有过滤器
            el: "#app2",
            data: {
                dt: new Date()
            },
            methods: {},
            //定义一个私有的过滤器(局部 )有两个条件  过滤器名称和处理函数
            filters: {
                //定义私有过滤器,过滤器有两个条件【过滤器名称和处理函数】
                dateFormat: function (dateStr, pattern = ' ') {
                    //根据给定的时间字符串,得到特定的时间
                    //padStart(这是补开头的)为了使时间不足两位的不足两位,比如2月是02,可以使用es6的方法,是字符串独有的方法,数字不行,所以要把数字转成字符串
                    var dt = new Date(dateStr)
                    var y = dt.getFullYear();
                    var m = (dt.getMonth() + 1).toString().padStart('2', "0");
                    var d = (dt.getDate()).toString().padStart('2', "0");

                    if (pattern && pattern.toLowerCase() === "yyyy-mm-dd") {
                        return `${y}-${m}-${d}`
                    } else {
                        var hh = (dt.getHours()).toString().padStart('2', "0");
                        var mm = (dt.getMinutes()).toString().padStart('2', "0");
                        var ss = (dt.getSeconds()).toString().padStart('2', "0");
                        return `${y}-${m}-${d} ${hh} :${mm}:${ss} ~~~`

                    }
                }
            },
            //自定义私有指令
            directives: {
                'fontweight': { //设置字体粗细
                    bind: function (el, binding) {
                        el.style.fontWeight = binding.value
                    }
                },
                //简写方式
                //注意:这个function等同于把代码写到bind和update里去 
                'fontsize': function (el, binding) {
                    el.style.fontSize = parseInt(binding.value)+'px'//因为50px是作为字符串传过来的,所以要转成parseint 由于可能传过来的是50,我们不知道是不是带px,所以手动加个px
                }
            }
        })
    </script>
</body>

</html>

改造后的品牌案例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
    <link rel="stylesheet" href="../lib/bootstrap3.3.7.css">
</head>

<body>
    <div id="app">

        <div class="panel panel-primary">
            <div class="panel-heading">
                <h3 class="panel-title">添加品牌</h3>
            </div>
            <div class="panel-body form-inline">
                <!-- 我们迁移到数据库 会自动递增ID,所以不需要写ID -->
                <label for="">
                    Name:
                    <input type="text" v-model="name" calss="form-control">
                </label>
                <input type="button" value="添加" @click="add" class="btn btn-primary">
            </div>
        </div>



        <table class="table table-bordered table-hover table-striped">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Ctime</th>
                    <th>Ctime</th>
                    <th>Operation</th>
                </tr>

            </thead>
            <tbody>
                <tr v-for="item in list" :key="item.id">
                    <td>{{item.id}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.Ctime}}</td>
                    <td>
                        <a href="" @click.prevent="del(item.id)">删除</a>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <script>
        //如果我们通过全局配置了请求的数据接口 根域名,则在每次单独发起http的时候,请求的url路径应该以相对路径开头,前面不能带斜线/,否则不会启用根路径做拼接
        Vue.http.options.root='http://vue.studyit.io/';
        //全局启用emulateJSON选项   这样在get或者post等方法中的括号可以删掉emulateJSON缩短代码
        Vue.http.options.emulateJSON=true;
        var vm = new Vue({
            el: "#app",
            data: {
                name: "",
                list: [{
                        id: 1,
                        name: '玛莎拉蒂',
                        Ctime: new Date()
                    },
                    {
                        id: 2,
                        name: '保时捷',
                        Ctime: new Date()
                    }
                ]

            },
            created() {
                //当vm实例的data和methods初始化完毕后,vm实例会自动执行created这个生命周期函数
                this.getAllList()
            },
            methods: {
                getAllList() {
                    //获取所有的品牌列表
                    // 分析:1.由于已经导入了Vue-resource这个包,所以可以直接通过this.$http来发起数据请求
                    // 2.根据接口API文档知道获取列表的时候,应该发起一个get请求
                    //3.this.$http.get('url').then(function(result){})
                    //4.当通过then指定回调函数之后 在回调函数中可以拿到数据服务器返回的result
                    //5.先判断result.status是否等于0,如果等于0就成功了,可以把result.message赋值给this.list,.如果不等于0,弹框提醒获取数据失败
                    this.$http.get('api/getprodlist').then(result => {
                        //注意:通过$httml获取到的数据,都在result.body上放着
                        var result = result.body
                        if (result.status === 0) {
                            this.list = result.message
                        } else {
                            alert("获取数据失败")
                        }
                    })
                },
                add() {
                //添加品牌列表到后台服务器
                //通过查看数据API接口的文档 要发送一个Post请求
                //this.$http.post()中接收三个参数  第一个参数:要请求的URL地址  第二个参数:要提交给服务器的数据,
                //要以对象形式提交给服务器{name:this.name}
                //第三个参数:是一个配置对象,要以哪种表单数据类型提交过去{emulateJSON:true}以普通表格格式将数据提交给服务器
                //在post方法中,使用.then来设置成功的回调函数,如果想要拿到成功的结果,用result.body
                this.$http.post('api/addproduct',{name:this.name}).then(result => {
                        //注意:通过$httml获取到的数据,都在result.body上放着
                        var result = result.body
                        if (result.status === 0) {
                            //添加完成后,只需要手动再调用以下getAllList就能刷新品牌列表了
                            this.getAllList()
                            //清空name
                            this.name=''
                        } else {
                            alert("添加失败")
                        }
                    })
                },
                del(id){//删除品牌列表
                    this.$http.get('api/delproduct'+id).then(result => {
                        //注意:通过$httml获取到的数据,都在result.body上放着
                        var result = result.body
                        if (result.status === 0) {
                            //删除成功
                            this.getAllList()
                        } else {
                            alert("删除失败")
                        }
                    })
                }
            }
        })
    </script>
</body>

</html>

猜你喜欢

转载自blog.csdn.net/x1037490413/article/details/107138861
今日推荐