VUE2(基于Java方向的学习)

VUE2(基于Java的学习)--笔记基于尚硅谷学习视频自己简写

Vue学习结构图

1. Vue简介

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架(自底向上逐层应用)。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

1、vue是什么?一套用于构建用户界面的渐进式JavaScript框架
2、谁开发的?尤雨溪 14年正式对外开发vue
3、vue的特点    
        1.采用组件化模式,提高代码复用率,切让代码更好维护  
        2.声明式编码,让编号人员无需直接操作DOM,提高开发效率   
        3.使用虚拟DOM(Virtual-DOM)+Diff算法,尽量复用DOM节点
Vue官网:[Vue.js (vuejs.org)](https://cn.vuejs.org/)

2. HelloWorld小案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <!-- 准备一个容器 -->
    <div id="root">
        <!-- vue 使用{{}}来分隔 -->
        <h1>hello,{{name}}</h1>
    </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
​
        //创建Vue实例   配置对象{}
        const x = new Vue({ //直接写成 new Vue
            // el:document.getElementById("root") 也可以
            el:'#root',  //el 元素,获取id为root,值供el使用
            data:{  //data存数据
                name:'world'
            }
        });
​
    </script>
</body>
</html>
初始Vue:
1.vue工作需要vue实例,且需要传入配置对象
2.root容器依然符合html规范,只不过混入了一些Vue语法
3.root容器里的代码被称为Vue模板
  • 插值语法

功能:用于解析标签体内容。
写法:{{xxxx}}是js表达式,且可以直接读取到data中的所有属性

3. 数据绑定

Vue中有2中数据绑定的方式:
1.单向绑定(v-bind):数据只能从data流向页而,简写成::href
2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data,简写:v-model:value==>v-model
​
数据单向绑定就是data向页面流动,而不是页面向data流动。只允许一个方向,不是只有一次机会。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        单项数据绑定:<input type="text" v-bind:value="name"/>
        <br/>
        双向数据绑定:<input type="text" v-model:value="name"/>
        <br/>
        双向数据简化:<input type="text" v-model="name"/>  
    </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        new Vue({
            el:'#root',
            data:{
                name:'逆鳞',
            }
        })
    </script>
</body>
</html>

4. el与data两种写法

1.e1有2种写法
(1).new Vue时就配置el属性。
(2).先创建Vue实例,随后再通过vm.$mount( " #root ')指定el的值。
2.data2种写法
(1).对象式
(2).函数式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE2-----REVIEW</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--    1.数据渲染-->
    <h1>{{param}}</h1>
​
    <!--    2.单项绑定属性 v-bind,简写:-->
    <a :href="image1">去你的,这是一个图片链接!点我就跳转,试试吧...</a>
​
    <!--    3.数据双向绑定 v-model:value="",简写v-model=""-->
    <!--    4.v-model绑定表单元素,会忽略表单元素的value,checked,selected属性的值-->
    <br><br><br>
    <label>
        <input type="text" placeholder="请输入你的姓名" v-model:value="username"/>
    </label>
    <h2>{{username}}</h2>
</div>
</body>
<script>
    // 使用vue就要创建,vue实例
    new Vue({
         el:'#app',
         data:{
             param:'hello world!',
             image1:'https://s1.ax1x.com/2022/05/30/X14MLV.jpg',
             username:'张三',
         }
     });
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VUE2-----REVIEW</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--    1.数据渲染-->
    <h1>{{param}}</h1>
​
    <!--    2.单项绑定属性 v-bind,简写:-->
    <a :href="image1">去你的,这是一个图片链接!点我就跳转,试试吧...</a>
​
    <!--    3.数据双向绑定 v-model:value="",简写v-model=""-->
    <!--    4.v-model绑定表单元素,会忽略表单元素的value,checked,selected属性的值-->
    <br><br><br>
    <label>
        <input type="text" placeholder="请输入你的姓名" v-model:value="username"/>
    </label>
    <h2>{{username}}</h2>
​
    <!--    5.事件绑定 v-on:click="fun",简写@click="fun"-->
    <button @click="show('hello',$event)">点击我吧!这里没有禁止</button>
    <br><br><br>
    <button @click="show1('hello world !')">你好世界!</button>
</div>
</body>
<script>
    //使用vue另一种创建实例对象
    const vm=new Vue({
        data:function () {
            return{
                param:'hello world!',
                image1:'https://s1.ax1x.com/2022/05/30/X14MLV.jpg',
                username:'张三',
            }
        },
        methods:{
            show:function (param,event) {
                console.log(param);
            },
            show1(param){
                alert(param);
            }
        }
    });
    vm.$mount("#app");
</script>
</html>

5. MVVM模型

M:model,对应data中的数据
V:  view,视图,Dom模板
VM: Vue实例对象,因此以后我们使用vm来拿vue实例对象

6. 事件

6.1 事件处理

1.点击事件 v-on:click="fun",vue中配置methods,v-on简写@
2.envent拿到事件发生的标签及标签中的值、属性等等
3.vue中的函数,this表示Vue实例,但不能使用箭头函数
4.方法也可放在data中,虽然不报错,性能有所下降
5.@click="demo”和@click="demo($event)”效果一致,但后者可以传参:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <button v-on:click="info">点击提示</button>
        <!-- 传参show('参数'),但event被你丢掉了-->
        <button @click="show('参数')">点击弹窗</button>
        <button @click="show1('参数',$event)">点击弹窗</button>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
​
            },
            methods:{
                info(e){
                    console.log(e.target.innerText);
                    console.log(this);
                    alert("hello");
                },
                show(num){
                    console.log(num);
                    alert("word")
                },
                show1(num,e){
                    console.log(e);
                }
            }
        })
    </script>
</body>
</html>

6.2 事件修饰符

Vue中的事件修饰符:
1.prevent:阻止默认事件(常用);
2.stop:阻止事件冒泡(常用);
3.once:事件只触发一次(常用);
4.capture:使用事件的插获模式;
5.self:只有event.target是当前操作的元素时才触发事件;
6.passive:事件的默认行为立即执行,无需等待事件回调执行完中;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件修饰符</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
    <style>
        .u{
            height: 200px;
            width: 200px;
            background-color: aqua;
            overflow:auto;
        }
        li{
            height: 100px;
        }
    </style>
</head>
<body>
​
    
    <div id="root">
        <!-- 使用prevent阻止的事件的默认行为   @click.prevent-->
        <a href="https://s1.ax1x.com/2022/05/30/X14MLV.jpg" v-on:click.prevent="showinfo">图片</a>
        <br/>
​
        <!-- 冒泡事件是从里向外,捕获事件是从外向内,使用stop阻止冒泡 -->
        <div class="a1" v-on:click="show1" style="background-color: red; padding-top: 20px;">
            <button v-on:click.stop="show1">点击提示</button>
        </div>
​
        <br/>
​
        <!-- once仅此一次 -->
        <button v-on:click.once="show1">仅此一次</button>
​
        <br/>
​
        <!-- 事件是先捕获再冒泡,capture在捕获时就开始加载-->
        <div class="a1" v-on:click.capture="show2(1)" style="background-color: red; padding-top: 20px;">
            <button v-on:click.stop="show2(2)">点击提示</button>
        </div>
​
        <br/>
​
        <!-- slelf只有自己操作时才触发 -->
        <!-- 以此为例 -->
        <div class="a1" v-on:click="show" style="background-color: red; padding-top: 20px;">
            <button v-on:click="show">点击提示</button>
        </div>
​
        <br/>
​
        <div class="a1" v-on:click.self="show3" style="background-color: red; padding-top: 20px;">
            <button v-on:click="show3">点击提示</button>
        </div>
​
        <!-- passive:事件的默认行为立即执行,无需等待事件回调执行完中; -->
        <!-- 滚动事件:1、scroll(鼠标滚动条) 2、wheel(鼠标滚轮) -->
        <ul class="u" @wheel.passive="demo">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
​
    <script type="text/javascript">
​
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
​
        const vm=new Vue({
            el:'#root',
            data:{
                name:'hello',
            },
            methods:{
                showinfo(e){
                    alert("hello");
                },
                show(e){
                    console.log(e.target);
                },
                show1(){
                    alert("a1");
                },
                show2(num){
                    console.log(num);
                },
                show3(e){
                    console.log(e.target);
                },
                demo(e){
                    console.log(@);
                }
            }
        })
    </script>
</body>
</html>

7. 计算属性computed

计算属性:
1.定义:要用的属性不存在,要通过已有属性计算得来。
2.原理:底层借助了objcet.defineproperty方法提供的getter和setter.
3.get函数什么时候执行?
(1).初次读取时会执行一次-
(2).当依赖的数据发生改变时会被再次调用。
4.优势:与methods实现相比,内部有缓存机制(复用)﹐效率更高,调试方便。5.备注:
1.计算属性最终会出现在vm上,直接读取使用即可。
2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
    性:<input type="text" v-model:value="firstName"> <br><br>
    名:<input type="text" v-model="lastName"> <br><br>
    全名:<span>{{fullName}}</span>
    <!-- 方法实现   全名:<span>{{fullName()}}</span> -->
    <!-- 插值实现   全名:<span>{{firstName + '-' +lastName}}</span> -->
    </div>
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
                firstName:'张',
                lastName:'三',
            },
            computed:{
                fullName:{
                    get(){
                        return this.firstName+'-'+this.lastName;
                    },
​
                    set(value){
                        const arr=value.split("-");
                        this.firstName=arr[0];
                        this.lastName=arr[1];
                    }
                }
            }
            // methods:{
            //     fullName(){
            //         return this.firstName+'-'+this.lastName;
            //     },
            // }
        })
    </script>
</body>
</html>

如果计算属性只读不改就可以使用简写格式。

fullName(){return xxxx}  ---->实际是执行的get方法,不是fullName函数。

8. 监听属性

监视属性watch:
1.当被监视的属性变化时,回调函数自动调用,进行相关操作
2.监视的属性必须存在,才能进行监视!!
3.监视的两种写法:
(1).new Vue时传入watch配置
(2).通过vm.$watch监视
​
watch的使用方法:
1、watch:{   ishat:{ handler(){  }}}
2、handler什么时候调用?当isHost发生改变时。
3、immediate:true 初始化时让handler调用一下
4、handler有两个参数,newValue,oldValue
5、监视vm.$watch('isHost',{})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <h1>今天天气是{{info}}</h1>
        <button v-on:click="changes">切换天气</button>
    </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
                isHost:true,
            },
            computed:{
                info:{
                    get(){
                        return this.isHost?'炎热':'凉快';
                    }
                }
                /*
                只读,可改写为info(){return this.isHost?'炎热':'凉快';}
                */
            },
            methods:{
                changes(){
                    this.isHost=!this.isHost;
                }
            },
            // watch:{   //监视
            //     isHost:{   //isHoat被监视
            //         immediate:true, //初始化就调用handler
            //         handler(newValue,oldValue){
            //             console.log(newValue,oldValue);
            //         }
            //     }
            // }
        })
        vm.$watch('isHost',{
            immediate:true, //初始化就调用handler
                handler(newValue,oldValue){
                    console.log(newValue,oldValue);
                }
        })
    </script>
</body>
</html>

9. 样式绑定

绑定样式:
1.class样式
法:class="xxx"XxX可以是字符串、对象、数组。
字符串写法适用于:类名不确定,要动态获取。
对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
数组写法适用于:要绑定多个样式,个数确定,名字也确定。但不确定用不用。
2. style样式
: style=""{fontsize: xxx)其中xxx是动态值
: style=""[a,b]”其中a、b是样式对象
<!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>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
    <style>
        .base{
            height: 200px;
            width: 200px;
            border: 1px solid black;
        }
​
        .sty1{
            background-color:chartreuse;
        }
​
        .sty2{
            background-color: aqua;
        }
​
        .arr1{
            font-size: 40px;
        }
​
        .arr2{
            border: 8px solid rebeccapurple;
        }
​
        .arr3{
            color: cyan;
        }
    </style>
</head>
<body>
​
    <div id="root">
​
        <!-- <div class="base" v-bind:class="a" v-on:click="changes">你好!年轻人</div> -->
​
        <!-- <div class="base" v-bind:class="['arr1','sty2']">你好!年轻人</div> -->
​
        <!-- <div class="base" v-bind:class="a" v-on:click="changes">你好!年轻人</div> -->
​
        <!-- <div class="base" v-bind:class="objectClass">你好!年轻人</div> -->
​
​
        <!-- <div class="base" v-bind:style="{fontSize: 40+'px'}">你好!年轻人</div> -->
​
        <!-- <div class="base" v-bind:style="obj">你好!年轻人</div> -->
​
        <div class="base" v-bind:style="{fontSize:40+'px',backgroundColor:'aqua'}">你好!年轻人</div>
​
    </div>
​
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
                a:'sty1',
                objectClass:{
                    sty1:'true',
                    arr1:'true',
                },
                obj:{
                    fontSize:'40px',
                    color:'red',
                    backgroundColor:'aqua',
                }
            },
            // methods:{
            //     changes(){
            //         this.a='sty2';
            //     }
            // }
            
            // methods:{
            //     changes(){
            //         const arr=['sty1','sty2'];
            //         const index=Math.floor(Math.random()*2);
            //         this.a=arr[index];
            //         console.log(index);
            //     }
            // }
        })
    </script>
</body>
</html>

10. 列表/条件渲染

条件渲染

条件演染:
1.v-if
写法:
(1).v-if="表达式"
(2).v-else-if=”表达式”
(3).v-else="表达式”适用于:切换频率较低的场景-
特点:不展示的DOM元素直接被移除。
注意: v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打晰”。
2.v-show
写法:v-show=表达式”,相当于display属性
适用于:切换频率较高的场景-
特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
4.template使用模板,只能用v-if使用

<!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 type="text/javascript" src="../vue.js"></script>
</head>
<body>
​
    <div id="root">
     <div v-show="n===1" v-bind:style="{height:'200px',width:'200px',backgroundColor:'red'}">你好!年轻人</div>
     <div v-if="n===1" v-bind:style="{height:'200px',width:'200px',backgroundColor:'aqua'}">你好!箱底们</div>
     <div v-else-if="n===3"  v-bind:style="{height:'200px',width:'200px',backgroundColor:'black'}">你好!老朋友们</div>
   </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
                n:1,
            },
        })
    </script>
</body>
</html>

列表渲染

1.用于展示列表数据
2.语法:v-for="(item,index) in xxx" : key="yyy"
3,可逾历:数组、对象、字符非(用的很少)、指定次数(用的很少)
key可以为某个字段属性,也可以为下标。但作为使用index下标要注意是否会逆向删除,因为会有index报错。
index这个问题不仅是vue中会有,基本上开发语言上都会遇见。java也一样。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>列表渲染</title>
    <script src="../vue.js"></script>
</head>
<body>
​
    <ul id="root">
​
        <!-- <h1>遍历数组</h1> -->
​
        <!-- <li v-for="p in person" :key="p.id">
            {{p.name}}-{{p.age}}
        </li> -->
​
        <!-- 上面是p.id  下面是下标 -->
        <!-- in  &&  of都可以 -->
        <!-- <li v-for="(p,index) of person" :key="index">
            {{p.name}}-{{p.age}}-{{index}}
        </li> -->
​
​
        <!-- <h1>遍历数组</h1>
        <li v-for="(value,key) in obj" :key="key">
            {{value}}---{{key}}
        </li> -->
​
​
        <!-- <h1>遍历字符串</h1>
        <li v-for="(char,key) in 'hello' " :key="key">
            {{char}}---{{key}}
        </li> -->
​
        <h1>遍历指定次数</h1>
        <li v-for="(num,key) in 5" :key="key">
            {{num}}---{{key}}
        </li>
​
    </ul>
​
    <script type="text/javascript">
        Vue.config.productionTip = false
        const vm=new Vue({
            el:'#root',
            data:{
                person:[
                    {id:1,name:'张三',age:12},
                    {id:2,name:'张二',age:11},
                    {id:3,name:'张一',age:10}
                ],
                obj:{
                    name:'nini',
                    age:90,
                    sex:'man',
                }
            }
        })
    </script>
</body>
</html>

11. 收集表单数据

v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。
​
收集表单数据:
若:<input type="text""/>,则v-model收集的是value值,用户输入的就是value值。若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。若:<input type="checkbox""/>
1.没有配置input的value属性,那么收集的就是checked(勾选or未勾选,是布尔值)
2.配置input的value届性:
(1)v-model的初始值是非数组,那么收集的就是checked(勾选or未勾选,是布尔值)
(2)v-model的初始值是数组,那么收集的的就是value组l成的数组
备注: v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字trim:输入首尾空格过滤
vue中v-model.number,就是输入的转化为数字
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
​
    <div id="root">
        <form @submit.prevent="test">
            <label class="" for="username">用户:</label>
            <input type="text" id="username" v-model:value="username">
​
            <br> <br>
​
            <label for="password">密码:</label>
            <input type="password" id="password" v-model:value="password">
            
            <br> <br>
​
            <label class="" for="sex">性别:</label>
            男 <input type="radio" name="sex" value="male" v-model:value="sex"> &nbsp; &nbsp;
            女 <input type="radio" name="sex" value="female" v-model:value="sex">
              
            <br> <br>
​
            <label for="hobby">爱好:</label>
            学习<input type="checkbox" v-model:value="hobby" value="study">
            跑步<input type="checkbox" v-model:value="hobby" value="跑步">
            打游戏<input type="checkbox" v-model:value="hobby" value="打游戏">
​
            <br> <br>
​
            <label class="" for="school">所属校区</label>
            <select v-model:value="school">
                <option value="">请选择校区</option>
                <option value="1号校区">1号校区</option>
                <option value="2号校区">2号校区</option>
            </select>
​
​
            <br> <br>
​
            <label class="" for="">其他信息</label>
            <textarea name="" id="" cols="30" rows="10" v-model="other"></textarea>
​
            <br> <br>
              
            <input type="checkbox" v-model="agree">阅读并接受<a href="#">《用户协议》</a>
​
            <br> <br>
​
            <input type="submit">
    </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        const vm=new Vue({
            el:'#root',
            data:{
                username:'',
                password:'',
                sex:'female',
                hobby:[],
                school:'',
                other:'',
                agree:'',
            },
            methods:{
                test(){
                    alert("数据!");
                    console.log(JSON.stringify(this._data));
                }
            }
        })
    </script>
</body>
</html>

12. 过滤器filter

过滤器:
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。语法:
1.注册过滤器:Vue.filter(name,callback)或new Vue{filters:{0)
2.使用过滤器: {{ xoxx|过滤器名}或v-bind:属性= “xxx|过滤器名"备注:
1.过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据,是产生新的对应的数据
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
    <!-- 引入dayjs文件 -->
    <script type="text/javascript" src="../dayjs.min.js"></script>
</head>
<body>
​
    <div id="app">
        <h1>时间戳:{{Date.now()}}</h1>
        <h1>现在时间:{{TimeStamp | timeFormat('YYYY-MM-DD HH:mm:ss')}}</h1>
        <!-- 使用filter来转换 -->
        <h1>现在时间:{{TimeStamp | timeFormat('YYYY年MM月DD日') | myslice()}}</h1>
        <h1>拆分:{{'hello word!' | my()}}</h1>
    </div>
​
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
        Vue.filter('my',function(value){
            return value.slice(0,3);
        })
        new Vue({
            el:'#app',
            data:{
                TimeStamp:1654178910982,
            },
            filters:{
                timeFormat(value,str){
                    return dayjs(value).format(str);
                },
                myslice(value){
                    return value.slice(0,4);
                }
            }
            // computed:{
​
            //     time:{
            //         get(){
            //             return dayjs(this.TimeStamp).format('YYYY-MM-DD HH:mm:ss');
            //         },
            //     }
            // }
            // methods:{
            //     time(){
            //         return dayjs(this.TimeStamp).format('YYYY-MM-DD HH:mm:ss');
            //     }
            // }
        })
    </script>
</body>
</html>

13. 指令

我们学过的指令:
v-bind:单向绑定解析表达式,可简写为:xXXv-model :双向数据绑定
v-for
:遍历数组/对象/字符串
v-on
:绑定事件监听,可简写为9
v-if
:条件演染(动态控制节点是否存存在)
v-else:条件演染(动态控制节点是否存存在)v-show:条件演染(动态控制节点是否展示)
v-text指令:
1.作用:向其所在的节点中演染文本内容。
2.与插值语法的区别:v-text会替换掉节点中的内容,{ixx)}则不会。
1.作用:向指定节点中演染包含html结构的内容。2.与插值语法的区别:
(1).v-html会替换掉节点中所有的内容,{{xx}则不会
(2).v-html可以识别html结构。
3.严重注意: v-html有安全性问题!!!!
(1).在网活上动态演染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html。永不要用在用户提交的内容上!
v-cloak指令(没有鄙:
1.本质是一个特属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}的问题。
v-once指令:
1.v-once所在节点在初次动态渲染后,就视为静态内容了。
2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
v-pre指令:
1.跳过其所在节点的编译过程。
2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

自定义指令

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点-
​
1、directives:{
xxxxx自定义属性,
big:{}  && big:function(a,b){console.log(a,b)}---->element,binding是a,b的对应
}
2、指令所在模板会重新解析
3、元素(标签)获取焦点---->element.focus()
4、对象写法中的函数:
绑定时bind(element,binding)  
插入页面时inserted(element,binding)  
重新解析update(element,binding)
5、自定义指令命名方法为多个单词下划线。注意我们在vue中命名一般u最好加单引号
6、vue.directive("xxxx",{})全局
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数式</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="element">
        <h1>当前n值为:{{n}}</h1>
        <h1>放大10倍n值为:<span v-big="n"></span></h1>
        <button @click="n++">点击我n+1</button>
        <br><br>
        <input type="text" v-fbind:value="n">
    </div>
​
    <script type="text/javascript">
​
        Vue.config.productionTip=false;
        const vm=new Vue({
            el:'#element',
            data:{
                n:1,
            },
            directives:{
                big(element,binding){
                    console.log(element);
                    console.log(binding);
                    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;
                        element.focus();
                    }
                }
            }
        })
    </script>
</body>
</html>

14. 生命周期函数(了解)

beforecreate-->created-->beforemount-->mounted-->beforeupdate-->update-->beforedestroy-->destroy
​
常用的生命周期钩子:
1.mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】
2.beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】.
关于销毁Vue实例Ⅰ
1.销毁后借助vue开发者工具看不到任何信息。
2.销毁后自定义事件会失效,但原生DOW事件依然有效。
3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

15. 组件

vue中使用组件的三大步骤:
一、如何定义一个组件?
使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options儿乎一样,但也有点区别;区别如下:
1.el不要写,为什么?—最终所有的组件都要经过一个vm的管理,tvm中的el决定服务哪个容器。2.data必须写成函数,为什么?——避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。
二、如何注册组件?
1.局部注册:靠new Vue的时候传入components选项2.全局注册: tvue.component("组件名",组件)
英上
三、编写组件标签:
<school></school>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <!-- 组件就是结构+数据+样式 -->
        <my-school></my-school>
        <student></student>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
​
        // Vue.component('组件名','组件');  全局注册
        //创建一个school组件
        const school=Vue.extend({
            name:'huhu',//定义vue控制台上那个组件名  这个可写可不写,不写会找注册时那个名字
            template:`<div><h1>{{schoolName}}</h1></div>`,
            data(){
                return {
                    schoolName:'1111',
                    address:'2222',
                }
            }
        })
​
        const student=Vue.extend({
            template:`<div><h1>{{studentName}}</h1></div>`,
            data(){
                return {
                    studentName:'3333',
                    age:'22',
                }
            }
        })
​
        new Vue({
            el:'#root',
            //局部注册
            components:{
                'my-school':school,
                student:student,
            }
        })
    </script>
</body>
</html>

组件嵌套

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始vue</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <tree></tree>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip=false //以阻止 vue 在启动时生成生产提示。
​
        const liTree=Vue.extend({
            template:'<div><h1>{{name}}</h1></div>',
            data(){
                return {
                    name:'小树',
                }
            }
        })
​
        const tree=Vue.extend({
            template:`<div><h1>{{name}}</h1>
                     <liTree></liTree></div>`,
            data(){
                return {
                    name:'大树',
                }
            },
            components:{
                liTree,
            }
        })
​
        //定义app组件,来管理所有组件
        const app=Vue.extend({
            
        })
​
        new Vue({
            el:'#root',
            components:{
                tree,
            }
        })
    </script>
</body>
</html>

16. Vue脚手架(了解)

单文件组件需要在脚手架中使用

创建Vue脚手架

1.npm config set registry https://registry.npm.taobao.org设置淘宝镜像
2.全局安装  npm install -g @vue/cli
3.切换到你要创建vue项目的目录   vue create 项目名
4.启动项目  npm run serve
  • 脚手架项目结构

脚手架简单练习

// School.vue
<template>
<!-- html结构 -->
    <div id="ro">
        <h1>{{name}}</h1><br>
        <button @click="tim">点击提示</button>
    </div>
</template>
​
<script>
// js
// 暴露js  1、export分布暴露  2、export {对象}统一暴露  3、export default xxx\
// 1、2、import {???} from ???   3、import ??? from ???
export default{
    name:'School',
    data(){
        return {
            name:'张三',
        }
    },
    methods: {
        tim(){
            alert('hello word !');
        }
    },
}
//export default Vue.extend() //Vue.extends可以省略
</script>
​
<style>
/* css */
    #ro{
        background-color: aqua;
    }
</style>
// App.vue
<template>
  <div>
    <img alt="Vue logo" src="./assets/logo.png">
    <School></School>
  </div>
</template>
​
<script>
import School from './components/School'
​
export default {
  name: 'App',
  components: {
    School,
}
}
</script>
​
<style>
</style>
// main.js
import Vue from 'vue'
import App from './App.vue'
​
Vue.config.productionTip = false
​
new Vue({
  // el:'#app',
  render: h => h(App),
}).$mount('#app')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我愿为一粒沙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值