zoukankan      html  css  js  c++  java
  • Vue初步学习

    Vue初步学习

    一、MVVM思想

    • M:即Model,模型,包括数据和一些基本操作
    • V:即View,视图,页面渲染结果
    • VM:即View-Model,模型与试图间的双向操作(无需开发人员干涉)

    二、学习资料

    官网

    参考

    github

    三、开发工具

    • VS CODE
      • 插件
        • auto close tag
        • auto rename tag
        • chinese
        • ESLint
        • HTML CSS Support
        • HTML Snippets
        • JavaScript
        • Live Server
        • open in browser
        • Vetur
        • vue 2 snippets

    四、初始化VUE

    • 创建目录vue2

    • # 在vue2目录下
      npm init -y
      npm install vue
      
    • 引入vue

      <script src="../node_modules/vue/dist/vue.js"></script>
      

    五、基本语法

    <!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>
    </head>
    
    <body>
        <!-- 给div赋予id -->
        <div id="app">
            <input type="text" v-model="num">
            <button v-on:click="num++">点赞</button>
            <button v-on:click="cancle">取消</button>
            <h1> {{name}} ,非常帅,有{{num}}个人为他点赞{{hello()}}</h1>
        </div>
    	// 引入vue
        <script src="./node_modules/vue/dist/vue.js"></script>
    
        <script>
            //1、vue声明式渲染
            let vm = new Vue({
                el: "#app",	//绑定元素
                data: {  	//封装数据
                    name: "张三",
                    num: 1
                },
                methods:{  	//封装方法
                    cancle(){
                        this.num -- ;
                    },
                    hello(){
                        return "1"
                    }
                }
            });
            //2、双向绑定,模型变化,视图变化。反之亦然。
            //3、事件处理
        </script>
    </body>
    
    </html>
    

    六、指令

    v-xx:指令
    1、创建vue实例,关联页面的模板,将自己的数据(data)渲染到关联的模板,响应式的
    2、指令来简化对dom的一些操作。
    3、声明方法来做更复杂的操作。methods里面可以封装方法。
    

    1、v-html、v-text

    <!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>
    </head>
    <body>
        <div id="app">
            <!-- 在3g网络或较慢网络中,会出现{{msg}},体验不好。 -->
            {{msg}}  {{1+1}}  {{hello()}}<br/>
            <span v-html="msg"></span>
            <br/>
            <span v-text="msg"></span>  
        </div>
       
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            new Vue({
                el:"#app",
                data:{
                    msg:"<h1>Hello</h1>",
                    link:"http://www.baidu.com"
                },
                methods:{
                    hello(){
                        return "World"
                    }
                }
            })
        </script>
    </body>
    </html>
    

    2、v-bind

    <!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>
    </head>
    <body>
        <!-- 给html标签的属性绑定 -->
        <div id="app"> 
    
            <a v-bind:href="link">gogogo</a>
    
            <!-- class,style  {class名:加上?}-->
            <!-- v-bind:,可简写为:<属性名>。单行绑定-->
            <span v-bind:class="{active:isActive,'text-danger':hasError}"
              :style="{color: color1,fontSize: size}">你好</span>
        </div>
    
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            let vm = new Vue({
                el:"#app",
                data:{
                    link: "http://www.baidu.com",
                    isActive:true,
                    hasError:true,
                    color1:'red',
                    size:'36px'
                }
            })
        </script>
    </body>
    </html>
    

    3、v-model

    <!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>
    </head>
    <body>
        <!-- 表单项,自定义组件 -->
        <div id="app">
            精通的语言:
            	<!-- v-model:双向绑定 -->
                <input type="checkbox" v-model="language" value="Java"> java<br/>
                <input type="checkbox" v-model="language" value="PHP"> PHP<br/>
                <input type="checkbox" v-model="language" value="Python"> Python<br/>
            <!-- .join(""),拼接 -->
            选中了 {{language.join(",")}}
        </div>
        
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            let vm = new Vue({
                el:"#app",
                data:{
                    language: []
                }
            })
        </script>
    </body>
    </html>
    

    4、v-on

    <!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>
    </head>
    
    <body>
        <div id="app">              
            <!--事件中直接写js片段-->
            <button v-on:click="num++">点赞</button>
            <!--事件指定一个回调函数,必须是Vue实例中定义的函数。-->
            <!-- v-on简写@ -->
            <button @click="cancle">取消</button>
            <!--  -->
            <h1>有{{num}}个赞</h1>
    
            <!-- 事件修饰符 -->
            <!-- .once 点击一次 -->
            <!-- .stop 防止冒泡。冒泡指父与子都有同样事件,触发子事件,父事件同样触发。事件会触发多次。 -->
            <!-- .prevent 拦截默认事件,此处作用:点击不会跳转百度 -->
            <div style="border: 1px solid red;padding: 20px;" v-on:click.once="hello">
                大div
                <div style="border: 1px solid blue;padding: 20px;" @click.stop="hello">
                    小div <br />
                    <a href="http://www.baidu.com" @click.prevent.stop="hello">去百度</a>
                </div>
            </div>
    
            <!-- 按键修饰符: -->
            <!-- v-on:keyup.up 按↑箭头触发事件 -->
            <!-- @click.ctrl ctrl+点击 触发事件 -->
            <input type="text" v-model="num" v-on:keyup.up="num+=2" @keyup.down="num-=2" @click.ctrl="num=10">	         <br />
            提示:
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            new Vue({
                el:"#app",
                data:{
                    num: 1
                },
                methods:{
                    cancle(){
                        this.num--;
                    },
                    hello(){
                        alert("点击了")
                    }
                }
            })
        </script>
    </body>
    </html>
    

    5、v-for

    <!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>
    </head>
    
    <body>
        <div id="app">
            <ul>
                <li v-for="(user,index) in users" :key="user.name" v-if="user.gender == '女'">
                    <!-- 1、显示user信息:v-for="item in items" -->
                   当前索引:{{index}} ==> {{user.name}}  ==>   {{user.gender}} ==>{{user.age}} <br>
                    <!-- 2、获取数组下标:v-for="(item,index) in items" -->
                    <!-- 3、遍历对象:
                            v-for="value in object"
                            v-for="(value,key) in object"
                            v-for="(value,key,index) in object" 
                    -->
                    对象信息:
                    <!-- (v,k,i) 值,键,索引 -->
                    <span v-for="(v,k,i) in user">{{k}}=={{v}}=={{i}};</span>
                    <!-- 4、遍历的时候都加上:key来区分不同数据,提高vue渲染效率
    					 遍历时最好加上key。key最好是唯一的。
    					 如果对象内由唯一ID则key为ID;
    					 名称如果唯一,可以也可是名称。
    					 再如nums: [1,2,3,4,4],则Key为index(索引)
                     -->
                </li>           
            </ul>
    
            <ul>
                <li v-for="(num,index) in nums" :key="index"></li>
            </ul>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
        <script>         
            let app = new Vue({
                el: "#app",
                data: {
                    users: [{ name: '柳岩', gender: '女', age: 21 },
                    { name: '张三', gender: '男', age: 18 },
                    { name: '范冰冰', gender: '女', age: 24 },
                    { name: '刘亦菲', gender: '女', age: 18 },
                    { name: '古力娜扎', gender: '女', age: 25 }],
                    nums: [1,2,3,4,4]
                },
            })
        </script>
    </body>
    
    </html>
    

    6、v-if、v-show

    <!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>
    </head>
    
    <body>
        <!-- 
            v-if,顾名思义,条件判断。当得到结果为true时,所在的元素才会被渲染。
            v-show,当得到结果为true时,所在的元素才会被显示。 
        -->
        <div id="app">
            <button v-on:click="show = !show">点我呀</button>
            <!-- 1、使用v-if显示 -->
            <!-- 彻底消失 -->
            <h1 v-if="show">if=看到我....</h1>
            <!-- 2、使用v-show显示 -->
            <!-- 加入了hide样式,本质还在 -->
            <h1 v-show="show">show=看到我</h1>
        </div>
    
        <script src="../node_modules/vue/dist/vue.js"></script>        
        <script>
            let app = new Vue({
                el: "#app",
                data: {
                    show: true
                }
            })
        </script>
    </body>
    
    </html>
    

    7、v-else、v-else-if

    <!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>
    </head>
    
    <body>
        <div id="app">
            <button v-on:click="random=Math.random()">点我呀</button>
            <span>{{random}}</span>
    
            <h1 v-if="random>=0.75">
                看到我啦?! &gt;= 0.75
            </h1>
    
            <h1 v-else-if="random>=0.5">
                看到我啦?! &gt;= 0.5
            </h1>
    
            <h1 v-else-if="random>=0.2">
                看到我啦?! &gt;= 0.2
            </h1>
    
            <h1 v-else>
                看到我啦?! &lt; 0.2
            </h1>
    
        </div>
    
    
        <script src="../node_modules/vue/dist/vue.js"></script>
            
        <script>         
            let app = new Vue({
                el: "#app",
                data: { random: 1 }
            })     
        </script>
    </body>
    
    </html>
    

    七、计算属性和监听器

    <!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>
    </head>
    
    <body>
        <div id="app">
            <!-- 某些结果是基于之前数据实时计算出来的,我们可以利用计算属性。来完成 -->
            <ul>
                <li>西游记; 价格:{{xyjPrice}},数量:<input type="number" v-model="xyjNum"> </li>
                <li>水浒传; 价格:{{shzPrice}},数量:<input type="number" v-model="shzNum"> </li>
                <li>总价:{{totalPrice}}</li>
                {{msg}}
            </ul>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            //watch可以让我们监控一个值的变化。从而做出相应的反应。
            new Vue({
                el: "#app",
                data: {
                    xyjPrice: 99.98,
                    shzPrice: 98.00,
                    xyjNum: 1,
                    shzNum: 1,
                    msg: ""
                },
                computed: {	// 组件
                    totalPrice(){
                        return this.xyjPrice*this.xyjNum + this.shzPrice*this.shzNum
                    }
                },
                watch: {	// 监听器
                    xyjNum(newVal,oldVal){
                        if(newVal>=3){
                            this.msg = "库存超出限制";
                            this.xyjNum = 3
                        }else{
                            this.msg = "";
                        }
                    }
                },
            })
        </script>
    
    </body>
    
    </html>
    

    八、过滤器

    <!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>
    </head>
    
    <body>
        <!-- 过滤器常用来处理文本格式化的操作。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 -->
        <div id="app">
            <ul>
                <li v-for="user in userList">
                    {{user.id}} ==> {{user.name}} ==> {{user.gender == 1?"男":"女"}} ==>
                    <!-- {{user.gender | gFilter}} 中的 | 管道符。将前者值传递给后者 -->
                    {{user.gender | genderFilter}} ==> {{user.gender | gFilter}}
                </li>
            </ul>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            // 全局过滤器
            Vue.filter("gFilter", function (val) {
                if (val == 1) {
                    return "男~~~";
                } else {
                    return "女~~~";
                }
            })
    
            let vm = new Vue({
                el: "#app",
                data: {
                    userList: [
                        { id: 1, name: 'jacky', gender: 1 },
                        { id: 2, name: 'peter', gender: 0 }
                    ]
                },
                filters: {
                    // filters 定义局部过滤器,只可以在当前vue实例中使用
                    genderFilter(val) {
                        if (val == 1) {
                            return "男";
                        } else {
                            return "女";
                        }
                    }
                }
            })
        </script>
    </body>
    
    </html>
    

    九、组件化基础

    <!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>
    </head>
    
    <body>
    
        <div id="app">
            <button v-on:click="count++">我被点击了 {{count}} 次</button>
            <!-- 调用组件 -->
            <counter></counter>
            <counter></counter>
            <counter></counter>
            <counter></counter>
            <counter></counter>
    		<!-- 调用组件 -->
            <button-counter></button-counter>
        </div>
        
        <script src="../node_modules/vue/dist/vue.js"></script>
    
        <script>
            //1、全局声明注册一个组件
            Vue.component("counter", {
                template: `<button v-on:click="count++">我被点击了 {{count}} 次</button>`,
                data() {
                    return {
                        count: 1
                    }
                }
            });
    
            //2、局部声明一个组件
            const buttonCounter = {
                template: `<button v-on:click="count++">我被点击了 {{count}} 次~~~</button>`,
                data() {
                    return {
                        count: 1
                    }
                }
            };
    
            new Vue({
                el: "#app",
                data: {
                    count: 1
                },
                components: {
                    'button-counter': buttonCounter
                }
            })
        </script>
    </body>
    </html>
    

    十、生命周期

    钩子函数(监听函数)

    <!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>
    </head>
    
    <body>
        <div id="app">
            <span id="num">{{num}}</span>
            <button @click="num++">赞!</button>
            <h2>{{name}},有{{num}}个人点赞</h2>
        </div>
    
        <script src="../node_modules/vue/dist/vue.js"></script>
        
        <script>
            let app = new Vue({
                el: "#app",
                data: {
                    name: "张三",
                    num: 100
                },
                methods: {
                    show() {
                        return this.name;
                    },
                    add() {
                        this.num++;
                    }
                },
                // 创建之前
                beforeCreate() {
                    console.log("=========beforeCreate=============");
                    console.log("数据模型未加载:" + this.name, this.num);
                    console.log("方法未加载:" + this.show());
                    console.log("html模板未加载:" + document.getElementById("num"));
                },
                // 创建完成
                created: function () {
                    console.log("=========created=============");
                    console.log("数据模型已加载:" + this.name, this.num);
                    console.log("方法已加载:" + this.show());
                    console.log("html模板已加载:" + document.getElementById("num"));
                    console.log("html模板未渲染:" + document.getElementById("num").innerText);
                },
                // 挂载之前(未渲染)
                beforeMount() {
                    console.log("=========beforeMount=============");
                    console.log("html模板未渲染:" + document.getElementById("num").innerText);
                },
                // 挂载完成
                mounted() {
                    console.log("=========mounted=============");
                    console.log("html模板已渲染:" + document.getElementById("num").innerText);
                },
                // 更新之前
                beforeUpdate() {
                    console.log("=========beforeUpdate=============");
                    console.log("数据模型已更新:" + this.num);
                    console.log("html模板未更新:" + document.getElementById("num").innerText);
                },
                // 已经更新
                updated() {
                    console.log("=========updated=============");
                    console.log("数据模型已更新:" + this.num);
                    console.log("html模板已更新:" + document.getElementById("num").innerText);
                }
            });
        </script>
    </body>
    
    </html>
    

    十一、简单构建模块化

    # 1、全局安装webpack
    npm install webpack -g
    
    # 2、全局安装vue脚手架
    npm install -g @vue/cli-init
    
    # 3、初始化vue项目
    # vue 脚手架使用 webpack 模板初始化一个appname的项目
    vue init webpack <appname>
    
    # 4、启动vue项目
    # 项目的package.json中由scripts,代表我们能运行命令
    npm start
    或 npm run dev
    

    十二、ELEMENT-UI

    文档

    # 1、安装
    npm install element-ui -S
    
    # 2、在 main.js 中写入以下内容:
    // 导入element-ui
    import ElementUI from 'element-ui';
    // 导入element-ui样式
    import 'element-ui/lib/theme-chalk/index.css';
    
    // 使用
    Vue.use(ElementUI);
    
    # 3、使用参考文档
    

    十三、vscode配置vue模板

    文件 ==> 首选项 ==> 用户片段 ==> 输入"vue"

    在vue.json输入一下内容

    {
    	"Print to console": {
    		"prefix": "vue",
    		"body": [
    			"<!-- $1 -->",
    			"<template>",
    			"<div class='$2'>$5</div>",
    			"</template>",
    			"",
    			"<script>",
    			"//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)",
    			"//例如:import 《组件名称》 from '《组件路径》';",
    			"",
    			"export default {",
    			"//import引入的组件需要注入到对象中才能使用",
    			"components: {},",
    			"data() {",
    			"//这里存放数据",
    			"return {",
    			"",
    			"};",
    			"},",
    			"//监听属性 类似于data概念",
    			"computed: {},",
    			"//监控data中的数据变化",
    			"watch: {},",
    			"//方法集合",
    			"methods: {",
    			"",
    			"},",
    			"//生命周期 - 创建完成(可以访问当前this实例)",
    			"created() {",
    			"",
    			"},",
    			"//生命周期 - 挂载完成(可以访问DOM元素)",
    			"mounted() {",
    			"",
    			"},",
    			"beforeCreate() {}, //生命周期 - 创建之前",
    			"beforeMount() {}, //生命周期 - 挂载之前",
    			"beforeUpdate() {}, //生命周期 - 更新之前",
    			"updated() {}, //生命周期 - 更新之后",
    			"beforeDestroy() {}, //生命周期 - 销毁之前",
    			"destroyed() {}, //生命周期 - 销毁完成",
    			"activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发",
    			"}",
    			"</script>",
    			"<style scoped>",
    			"$4",
    			"</style>"
    		],
    		"description": "Log output to console"
    	}
    }
    

    在建立.vue文件时,输入vue即可快速生成模板。

    vue模板三要素:template、script、style


    本文内容学习自谷粒商城--微服务分布式电商项目-分布式基础。

    课程地址

  • 相关阅读:
    Ado.Net 实体框架学习笔记3
    Ado.Net 实体框架学习笔记1
    PV3D的小练习~太阳系八大行星
    AS3数组的应用,flash制作流星雨~
    电脑安全措施小贴士(摘)
    Windows下MySql批处理命令
    命令行批量改文件名
    汉字转拼音(asp)(摘录)
    sql server login与user的区别(摘)
    MySql四舍五入
  • 原文地址:https://www.cnblogs.com/luckyzs/p/13160445.html
Copyright © 2011-2022 走看看