vue前端框架第二天

1.一个具有增删改查的页面(用了bootstrap)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <link rel="stylesheet" href="./lib/bootstrap-3.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">
                    <label>
                        Id:
                        <!--v-model 和vue中的数据进行双向绑定-->
                        <input type="text" class="form-control" v-model="id">
                    </label>

                    <label>
                            Name:
                            <input type="text" class="form-control" v-model="name">
                    </label>
                                                                            <!--add为有参函数-->
                    <input type="button" value="添加" class="btn btn-primary" @click="add()">

                    <label>
                            搜索名称关键字:
                            <input type="text" class="form-control" v-model="keywords">
                    </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中的数据都是来自list  现在是来自search方法中-->
                    <tr v-for="item in search(keywords)" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td v-text="item.ctime"></td>
                        <td>
                            <!--prevent事件修饰符 不刷新界面-->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
         </table>

    </div>
    
    
   
    

    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                id:'',
                name:'',
                ctime:'',
                keywords:'', //搜索的关键字
                list:[
                   {id:1,name:'奔驰',ctime:new Date()}, 
                   {id:2,name:'宝马',ctime:new Date()}  
                ]
            },
            methods:{
                add(){//添加方法
                   // console.log('aaa');   clg
                    var car = { id:this.id,name:this.name,ctime:new Date()}  //创建新对象
                    this.list.push(car)       //传给list
                    this.id = this.name = ''  //赋为空值
                },
                del(id){//根据id删除数据
                    // this.list.some((item,i)=>{
                    //     if(item.id=id){ //说明找到了  在some方法中如果返回true了 就会立即阻止数组的后续循环 
                    //         this.list.splice(i,1) //删除
                    //         return true;
                    //     }
                    // })

                    var index = this.list.findIndex(item=>{   //找到指定的索引值
                        if(item.id=id){
                            return true;
                        }
                    })

                    this.list.splice(index,1)   //删除数据
                },
                search(keywords){ //根据关键字进行数据的搜索
                    // var newList = []
                    // this.list.forEach(item => {
                    //     if(item.name.indexOf(keywords) != -1){  //indexOf判断是否包含字符串
                    //         newList.push(item)
                    //     }
                    // });
                    // return newList


                    // 注意:  forEach   some   filter   findIndex   这些都属于数组的新方法,
                    //  都会对数组中的每一项,进行遍历,执行相关的操作;
                    var newList = this.list.filter(item=>{
                         // 注意 : ES6中,为字符串提供了一个新方法,叫做  String.prototype.includes('要包含的字符串')
                        //  如果包含,则返回 true ,否则返回 false
                         //  contain
                        if (item.name.includes(keywords)) {
                        return item
                        }

                    })

                    return newList
                }
    
            }
        });
    </script>
</body>
</html>

2.升级版本加了过滤器

1>.在vue中定义过滤器

在这里插入图片描述
全局过滤器

 Vue.filter('dateFormat',function(datestr,pattern){
                    var dt = new Date(datestr)
                    
                    var y = dt.getFullYear()
                    var m = dt.getMonth()+1
                    var d = dt.getDay()


                    //用的~键的下面那个符号!
                  //  return `${y}-${m}-${d}`

                    if (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}`
                    }
                        
         })

局部过滤器

 var vm = new Vue({
            el:'#app2',
            data:{
                dt:new Date()
            },
            filters:{
                dateFormat:function(datestr,pattern){
                    var dt = new Date(datestr)
                    
                    var y = dt.getFullYear()
                    var m = dt.getMonth()+1
                    var d = dt.getDay()


                    //用的~键的下面那个符号!
                  //  return `${y}-${m}-${d}`

                    if (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}~~~~~~~`
                    }
                }
            }
        })

2>.使用过滤器

<td>{{item.ctime | dateFormat('yyyy-mm-d')}}</td>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
    <link rel="stylesheet" href="./lib/bootstrap-3.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">
                    <label>
                        Id:
                        <!--v-model 和vue中的数据进行双向绑定-->
                        <input type="text" class="form-control" v-model="id">
                    </label>

                    <label>
                            Name:
                            <input type="text" class="form-control" v-model="name">
                    </label>
                                                                            <!--add为有参函数-->
                    <input type="button" value="添加" class="btn btn-primary" @click="add()">

                    <label>
                            搜索名称关键字:
                            <input type="text" class="form-control" v-model="keywords">
                    </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中的数据都是来自list  现在是来自search方法中-->
                    <tr v-for="item in search(keywords)" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.ctime | dateFormat('yyyy-mm-d')}}</td>
                        <td>
                            <!--prevent事件修饰符 不刷新界面-->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
         </table>

    </div>
    
    
   
    

    <script>

        Vue.filter('dateFormat',function(datestr,pattern){
                    var dt = new Date(datestr)
                    
                    var y = dt.getFullYear()
                    var m = dt.getMonth()+1
                    var d = dt.getDay()


                    //用的~键的下面那个符号!
                  //  return `${y}-${m}-${d}`

                    if (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}`
                    }
                        
         })


        var vm = new Vue({
            el:'#app',
            data:{
                id:'',
                name:'',
                ctime:'',
                keywords:'', //搜索的关键字
                list:[
                   {id:1,name:'奔驰',ctime:new Date()}, 
                   {id:2,name:'宝马',ctime:new Date()}  
                ]
            },
            methods:{
                add(){//添加方法
                   // console.log('aaa');   clg
                    var car = { id:this.id,name:this.name,ctime:new Date()}  //创建新对象
                    this.list.push(car)       //传给list
                    this.id = this.name = ''  //赋为空值
                },
                del(id){//根据id删除数据
                    // this.list.some((item,i)=>{
                    //     if(item.id=id){ //说明找到了  在some方法中如果返回true了 就会立即阻止数组的后续循环 
                    //         this.list.splice(i,1) //删除
                    //         return true;
                    //     }
                    // })

                    var index = this.list.findIndex(item=>{   //找到指定的索引值
                        if(item.id=id){
                            return true;
                        }
                    })

                    this.list.splice(index,1)   //删除数据
                },
                search(keywords){ //根据关键字进行数据的搜索
                    // var newList = []
                    // this.list.forEach(item => {
                    //     if(item.name.indexOf(keywords) != -1){  //indexOf判断是否包含字符串
                    //         newList.push(item)
                    //     }
                    // });
                    // return newList


                    // 注意:  forEach   some   filter   findIndex   这些都属于数组的新方法,
                    //  都会对数组中的每一项,进行遍历,执行相关的操作;
                    var newList = this.list.filter(item=>{
                         // 注意 : ES6中,为字符串提供了一个新方法,叫做  String.prototype.includes('要包含的字符串')
                        //  如果包含,则返回 true ,否则返回 false
                         //  contain
                        if (item.name.includes(keywords)) {
                        return item
                        }

                    })

                    return newList
                }
    
            }
        });
    </script>
</body>
</html>

3>.过滤器调用的时候采用的是就近原则

名字相同的时候优先于局部过滤器

3.padStart(让时间显示为1月变成01月)

  var y = dt.getFullYear().toString().padStart(2,'0')
                    var m = (dt.getMonth()+1).toString().padStart(2,'0')
                    var d = dt.getDay().toString().padStart(2,'0')
var vm = new Vue({
            el:'#app2',
            data:{
                dt:new Date()
            },
            filters:{
                dateFormat:function(datestr,pattern){
                    var dt = new Date(datestr)
                    
                    var y = dt.getFullYear().toString().padStart(2,'0')
                    var m = (dt.getMonth()+1).toString().padStart(2,'0')
                    var d = dt.getDay().toString().padStart(2,'0')


                    //用的~键的下面那个符号!
                  //  return `${y}-${m}-${d}`

                    if (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}~~~~~~~`
                    }
                }
            }
        })

4.键盘自定义修饰符

vue自带的
在这里插入图片描述

1.>基本使用

当Enter键盘抬起的时候调用自定义的add方法

<input type="text" class="form-control" v-model="name" @keyup.enter="add()">

enter对应13

<input type="text" class="form-control" v-model="name" @keyup.13="add()">

也能去查键盘的码值
例如F2 对应的113

<input type="text" class="form-control" v-model="name" @keyup.113="add()">

2.>起别名

<input type="text" class="form-control" v-model="name" @keyup.ff="add()">

在vue中

Vue.config.keyCodes.ff=13

5.自定义指令

在这里插入图片描述

使用:

<input type="text" class="form-control" v-model="keywords" v-focus>

功能:

使改文本框获得页面焦点

定义:

//自定义Vue指令,使用的时候需要加 v-
        Vue.directive('focus',{
            bind:function(){  //只执行一次 用于初始化

            },
            inserted:function(el){//表示插入  插入到DOM中  只执行一次
            //js行为用inserted
                el.focus()
                
            }, 
            updated:function(){ //表示更新  可执行多次

            }
        })

在这里插入图片描述

<input type="text" class="form-control" v-model="keywords" v-focus v-color>
Vue.directive('color',{
            bind:function(el){  //只执行一次 用于初始化
            	//样式用bind
                el.style.color='red'
            },
            inserted:function(el){//表示插入  插入到DOM中  只执行一次
              //  el.focus()
            }, 
            updated:function(){ //表示更新  可执行多次

            }
        })

在这里插入图片描述

应用

自己选择颜色

<input type="text" class="form-control" v-model="keywords" v-focus v-color="'blue'">
Vue.directive('color',{
            bind:function(el,binding){  //只执行一次 用于初始化
                el.style.color=binding.value
            },
            inserted:function(el){//表示插入  插入到DOM中  只执行一次
              //  el.focus()
            }, 
            updated:function(){ //表示更新  可执行多次

            }
        })

自定义字体

<h3 v-color="'pink'" v-fontWeight="900" v-fontSize="30">{{dt | dateFormat("")}}</h3>
 directives:{
               // 自定义指令 
                'fontweight': {  //加粗字体
                    bind:function(el,binding){  //只执行一次 用于初始化
                    el.style.fontWeight=binding.value
                    }
                },
                'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
                    el.style.fontSize = parseInt(binding.value) + 'px'
                }

6.vue实例的生命周期

在这里插入图片描述

<script>
                var vm = new Vue({
                    el:'#app',
                    data:{
                        msg:'OK'
                    },
                    methods:{
                        show(){
                            console.log('执行了show方法')
                        }
                    
                    },
                    beforeCreate(){ //遇到的第一个生命周期函数 此时vm中的data和methods还没有初始化  只是一些默认的事件和生命周期函数初始化了
                        console.log(this.msg)  //都找不到
                        this.show()
                    },
                    created(){//遇到的第二个生命周期函数  此时的data和methods已经初始化了
                       console.log(this.msg)  
                        this.show()
                    },
                    beforeMount(){//遇到的第三个生命周期函数    表示app的模板已经在内存中加载完毕 但是在页面中还没有渲染
                        console.log(document.getElementById('h3').innerText)  
                    },
                    mounted(){//遇到的第四个生命周期函数  页面已经渲染完毕了
                        console.log(document.getElementById('h3').innerText)  
                    }
                });
            </script>

运行结果
在这里插入图片描述

//此时Vue初始化完毕了
                    //下面是运行阶段了
                    //数据一定要更新才能进行下面的函数
                    beforeUpdate(){
                        console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
                        console.log('data 中的 msg 数据是:' + this.msg)
                        // updated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的
                        //数据还未渲染到页面上
                    },
                    updated(){
                        console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
                        console.log('data 中的 msg 数据是:' + this.msg)
                        // updated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的
                    }

beforeUpdate 多次点击按钮不同步
在这里插入图片描述
updated 多次点击按钮同步
在这里插入图片描述
beforeDestroy

destroy
在这里插入图片描述

7.Vue发送数据(Ajax)请求(Vue-resource)

在这里插入图片描述

导包

<script src="./lib/vue-2.4.0.js"></script>
    <!-- 注意:vue-resource 依赖于 Vue,所以先后顺序要注意  -->
    <!-- this.$http.jsonp  可以理解成在vue中添加一个属性-->
    <script src="./lib/vue-resource-1.3.4.js"></script>
<div id="app">
    <input type="button" value="get请求" @click="getInfo">
    <input type="button" value="post请求" @click="postInfo">
    <input type="button" value="jsonp请求" @click="jsonpInfo">
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {
        getInfo() { // 发起get请求
          //  当发起get请求之后, 通过 .then 来设置成功的回调函数
          this.$http.get('http://vue.studyit.io/api/getlunbo').then(function (result) {
            // 通过 result.body 拿到服务器返回的成功的数据
            // console.log(result.body)
          })
        },
        postInfo() { // 发起 post 请求   application/x-wwww-form-urlencoded
          //  手动发起的 Post 请求,默认没有表单格式,所以,有的服务器处理不了
          //  通过 post 方法的第三个参数, { emulateJSON: true } 设置 提交的内容类型 为 普通表单数据格式
          this.$http.post('http://vue.studyit.io/api/post', {}, { emulateJSON: true }).then(result => {
            console.log(result.body)
          })
        },
        jsonpInfo() { // 发起JSONP 请求
          this.$http.jsonp('http://vue.studyit.io/api/jsonp').then(result => {
            console.log(result.body)
          })
        }
      }
    });
  </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用\[1\]: Django是一个使用Python编写的开源Web应用程序框架。它遵循了MVC(模型-视图-控制器)的设计模式,提供了一套强大的工具和库,用于快速开发高质量的Web应用程序。Django的视图是处理用户请求并返回响应的函数或方法。视图可以从数据库中检索数据,处理表单提交,渲染模板等。引用\[2\]: Django中的视图可以通过将其映射到URL来调用。在项目目录的urls.py文件中,可以将视图函数与URL路径进行映射。例如,可以通过导入视图函数并将其与URL路径进行映射来注册应用。引用\[3\]: Django的视图可以用于构建HTML的视图页面,并实现页面之间的跳转。在视图函数中,可以通过渲染模板来生成HTML页面,并通过URL路径进行页面之间的跳转。 从以上引用内容可以看出,Django是一个后端框架,用于构建Web应用程序。如果你想要使用Python进行前端开发,可以考虑使用其他前端框架,如React、Vue.js或Angular等。这些框架可以与Django进行集成,以实现前后端分离的开发模式。 #### 引用[.reference_title] - *1* *2* *3* [Python经典前端框架:Django,第二天【Django基础--视图】](https://blog.csdn.net/laozhu_Python/article/details/121715823)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑瞳丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值