Vue.js

一、Vue安装简介

1.1 安装

1.2 快速开始

  • Vue的js写法

    var vm = new Vue({
    	el: '#app',
    	data: {
    		// 保存数据
    		d1: '',
    	},
        // 加载js即执行
    	mounted: function(){
    		
            this.demo_fun();
    	},
        // 函数定义
        methods: {      
            demo_fun: function () {
                // 函数与数据的使用方式
                this.d1 = this.demo_fun2()
            },
            
            demo_fun2: function () {
                return 'd'
            }
        },
        // 计算属性  html内容为{{reversedMessage}}时,将执行computed中对应函数
    	computed: {
    		reversedMessage: function () {
    			return this.message.split('').reverse().join("")
    		},
    	},
    	// 侦听属性  当data中的数据message变化时,将执行watch中其对应函数
    	watch: {
    		message: function (newval, oldval) {
    			console.log(newval + "|" + oldval);  // 在浏览器的检查 --> console中查看
    		},
    	},
        // 定义局部过滤器  {{ price | RMB }}
    	filters: {
    		RMB: function (value) {
    			if (value == '') {
    				return;
    			}
    			return '$' + value
    		},
    	},
    });
    //定义全局过滤器  {{ price | Yuan}}
    Vue.filter('Yuan', function (value) {
        if (value == '') {
            return;
        }
        return '$' + value + '元'
    });
    
  • Vue页面数据展示

    var vm = new Vue({
    	el: '#app',
    	data: {
    		num: 3,
    		username: '',
    		show: true,
    
    		items: ["java", "python", "php"],
            oPerson: {
            	"name": "zs",
            	'age': '16',
            },
    
    		a_href: "https://www.baidu.com",
    	},
    	methods: {
    		demo_fun: function(){}
    axios
    
    Vue没有Ajax, 使用axios.js库实现https://github.com/axios/axios/releases
    
    
    axios({
        method: 'post',
        url: '/user/12345',
        data: {
            firstName: 'S',
            lastName: 'Z'
        }
    }).then(response=>{
        this.name = this.name+'zs'
    }).catch(error=>{
        this.age = this.age+12
    })
    	}
    })
    
    
    
      <!---->
    
    
    <!--数据展示-->
    {{ username }}  <!--基本数据展示-->
    {{ num + 1 }}  <!--数值操作-->
    {{ username.split("").reverse().join("") }}  <!--字符串操作-->
    {{ show ? 'show is true' : 'show is false' }}  <!--数据根据条件展示-->
    
    
    <!--元素的选择性展示-->
    <span v-show='show_html'></span>  <!--show_html为true展示该元素,为false隐藏该元素-->
    <span v-if='num==3'></span>  <!--v-if='true'显示,反之隐藏, v-if会删除标签,v-show不会删除-->
    <span v-else-if='num==4'></span>
    <span v-else>not 3 4</span>
    
    
    <!--数据双向绑定, js中变化,html跟着变化-->
    <span v-model='username'></span>  <!--双向数据绑定, html元素值和js中username值相同-->
    
    
    <!--绑定class-->
    <span :class="{class-ative:show}"></span>  <!--绑定类class属性-->
    <span :class="[{class-active:show}, 'class-hidden']"></span> <!--既有绑定类,又有固定类-->
    
    
    <!--列表数据循环展示-->
    <ul v-for="(item, index) in items">
        <li>{{ index+1 }}. {{ item }}</li>
    </ul>
    <!--字典数据循环展示-->
    <ul v-for="(value, key) in oPerson" >
        <li>{{ key }} --- {{ value }}</li>
    </ul>
    
    
    <!--指令:绑定元素属性-->
    <a :href="a_href" >超链接</a><br>  <!-- : 绑定一个变量-->
    <button @click="demo_fun" >修改</button><br>  <!-- @ 绑定一个变量处理(如:num+=1)或方法-->
    
    
    <!--事件处理-->
    <!-- 阻止事件继续传播, 事件传播是指向内层传播, 如 外层div的@click会对内层div起作用, 此时就需要在内层div上加上 @click.stop  -->
    <input @click.stop="count += 1" type="button" value="增加1">
    <!-- 阻止默认提交行为 -->
    <form @submit.prevent="demo_fun"></form>
    <!-- 修饰符可以串连 -->
    <a @click.stop.prevent="demo_fun">doThis</a>
    
  • axios

    Vue没有Ajax, 使用axios.js库实现https://github.com/axios/axios/releases

    axios({
        method: 'post',
        url: '/user/12345',
        data: {
            firstName: 'S',
            lastName: 'Z'
        }
    }).then(response=>{
        this.name = this.name+'zs'
    }).catch(error=>{
        this.age = this.age+12
    })
    

二. 语法

2.1 HelloWorld

  • 示例

    <script src="../js/vue.js" ></script>
    
    <div id="app" >
        {{ msg }}
        <input type="button" value="变换" @click="fnChange" >
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                msg: "hello world",
            },
            methods: {
                fnChange: function(){
                    this.msg = this.msg.split("").reverse().join("")
                }
            },
        })
    </script>
    

2.2 插入值及指令(:, @)

  • 示例

    <div id="app" >
        <!-- 插入值 -->
        {{ num + 1 }}<br>
        {{ msg }}<br>
        {{ ok ? 'yes' : 'no' }}<br>
        {{ message }}<br>
        {{ message.split("").reverse().join("") }}<br><br>
    
        <!-- 指令 -->
        <a v-bind:href="a_href" >a超链接</a><br>
        <a :href="a_href" >a超链接</a><br>
        <button v-on:click="fnChangeMessage" >修改button:v-on</button><br>
        <button @click="fnChangeMessage" >修改button:@</button><br>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                num: 1,
                msg: "message",
                ok: false,
                message: "this is message",
                a_href: "https://www.baidu.com",
            },
            methods: {
                fnChangeMessage: function(){
                    this.message = this.message.split("").reverse().join("")
                }
            },
        })
    </script>
    

2.3 Class绑定

  • 示例

    <body>
        <div id="app" >
            <!-- 对象的形式 -->
            <div :class="{big:isBig, red:isRed}" >1 content</div>
    
            <!-- 列表形式 -->
            <!-- 注意引号, 没有定义的data要加 '' -->
            <div :class="['big', 'red']" >2 content</div>
            <div :class="[isBig?'big':'', 'red']" >2 content</div>
            <div :class="[{big:isBig}, 'red']" >3 content</div>
        </div>    
    </body>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                isBig: false,
                isRed: true,
            },
        })
    </script>
    
    <style type="text/css" >
        .big{
            font-size: 40px
        }
        .red{
            color: red;
        }
    </style>
    

2.4 案例 – 选项卡

  • 示例

    <div id="app">
        <div class="tab_con">
            <input type="button" value="一" :class="{current: iNow==0}" @click="iNow=0">
            <input type="button" value="二" :class="{current: iNow==1}" @click="iNow=1" >
            <input type="button" value="三" :class="{current: iNow==2}" @click="iNow=2">
        </div>
        <div class="tab_cons">
            <div :class="{current: iNow==0}">第一个</div>
            <div :class="{current: iNow==1}">第二个</div>
            <div :class="{current: iNow==2}">第三个</div>
        </div>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                iNow: 2
            },
        })
    </script>
    
    <style type="text/css">
        .current {
            font-size: 30px;
            color: red;
        }
    </style>
    

2.5 条件循环下的数据渲染

  • 条件

    v-if, v-show

    <div id="app">
        <!-- v-if 条件控制 -->
        <div v-if="type=='A'">A</div>
        <div v-else-if="type=='B'">B</div>
        <div v-else>NOT A B</div>
    
        <!-- v-show不会直接删除标签, v-if直接删除再创建-->
        <div v-show="isOk">OK</div>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                type: 'A',
                isOk: true,
            }
        })
    </script>
    
  • 列表与字典循环渲染

    <div id="app">
        <!-- 渲染列表 -->
        <ul v-for="item in items">
            <li>{{ item }}</li>
        </ul><hr>
        <!-- 加上索引 -->
        <ul v-for="(item, index) in items">
            <li>{{ index+1 }}. {{ item }}</li>
        </ul><hr>
        <!-- 渲染字典, 注意: value在前,key在后, 只有一个参数时取值为value -->
        <ul v-for="(value, key) in oPerson" >
            <li>{{ key }} --- {{ value }}</li>
        </ul><hr>
    </div>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                items: ["java", "python", "php"],
                oPerson: {
                    "name": "zs",
                    'age': '16',
                },
            },
        })
    </script>
    

2.6 事件处理(v-on)

  • 示例

    <div id="app">
        <p>{{ count }}</p>
        <!-- 简单事件可在v-on中直接处理逻辑 -->
        <input v-on:click="count += 1" type="button" value="增加1">
        <!-- v-on <==> @ -->
        <input @click="fnShow" type="button" value="弹出count的值">
    
        <!-- 阻止事件继续传播, 事件传播是指向内层传播, 如 外层div的@click会对内层div起作用, 此时就需要在内层div上加上 @click.stop  -->
        <input @click.stop="count += 1" type="button" value="增加1">
        <!-- 阻止默认提交行为 -->
        <form @submit.prevent="onSubmit"></form>
        <!-- 修饰符可以串连 -->
        <a @click.stop.prevent="doThis">doThis</a>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                count: 0
            },
            methods: {
                fnShow: function(){
                    alert("count的值为: " + this.count)
                }
            }
        })
    </script>
    

2.7 弹窗示例

  • 示例

    <div id="app">
        <input type="button" value="弹窗" @click="aShow=true">
        <div v-show="aShow">这是一个广告</div>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                aShow: false,
            }
        })
    </script>
    

2.8 表单输入绑定

  • 用v-model指令双向数据绑定<input>textarea

    <div id="app">
        <form>
            <!-- v-model 内容显示在输入框中 双向数据绑定 -->
            <!-- 绑定单行, 多行数据 -->
            <p>{{ message }}</p>
            <input v-model="message" placeholder="edit me">
            <textarea v-model="message" placeholder="addmultiple lines"></textarea>
    
            <!-- 绑定单选框 -->
            <p>{{ xinbie }}</p>
            <input type="radio" value="0" name="gender" v-model="xinbie">男
            <input type="radio" value="1" name="gender" v-model="xinbie">女
    
            <!-- 绑定复选框 -->
            <p>{{ aihao }}</p>
            <input type="checkbox" name="hobby" value="study" v-model="aihao">
            <input type="checkbox" name="hobby" value="basket" v-model="aihao">
            <input type="checkbox" name="hobby" value="foot" v-model="aihao">
    
            <!-- 绑定下拉框 -->
            <p>{{ site }}</p>
            <select v-model="site">
                <option value="0">北京</option>
                <option value="1">上海</option>
                <option value="2">天津</option>
                <option value="3">成都</option>
            </select>
        </form>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                message: "msg",
                xinbie: "0",
                aihao: [],
                site: "3",
            }
        })
    </script>
    

2.9 计算属性和侦听属性

  • 示例

    <div id="app">
        <div id="example">
            <!-- 计算属性 -->
            <!-- 对于复杂的逻辑表达式, 可以使用计算属性, 如下面两个是等价的 -->
            <p>{{ message.split("").reverse().join("") }}</p>
            <p>{{ reversedMessage }}</p>
    
            <!-- 侦听属性 -->
            <!-- 当某个值或对象改变后, 触发对应的方法 -->
            <input type="button" value="侦听button" @click="fnChangeMessage">
    
        </div>
    </div>
    
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                "message": "this is a message"
            },
            // 计算属性
            computed: {
                reversedMessage: function () {
                    return this.message.split('').reverse().join("")
                },
            },
            // 侦听属性
            watch: {
                message: function (newval, oldval) {
                    console.log(newval + "|" + oldval);  // 在浏览器的检查 --> console中查看
                }
            },
            methods: {
                fnChangeMessage: function () {
                    this.message = this.message + " new"
                }
            }
        })
    </script>
    

2.10 过滤器

  • 示例

    <div id="app">
        <!-- 过滤器实现上是一个函数 -->
        <p>{{ price | RMB }}</p>
        <p>{{ price | Yuan}}</p>
        <div :id="rawId | formatId"></div>
    </div>
    
    <script>
        <!--定义全局过滤器-->
        Vue.filter('Yuan', function (value) {
            if (value == '') {
                return;
            }
            return '$' + value + '元'
        });
        var vm = new Vue({
            el: "#app",
            data: {
                price: 30,
                rawId: 2,
            },
            // 定义局部过滤器
            filters: {
                RMB: function (value) {
                    if (value == '') {
                        return;
                    }
                    return '$' + value
                }
            }
        })
    </script>
    

2.11 Vue生命周期

  • mounted方法

    • 初始化操作, 相当于ready方法, 加载js后自动执行
    <script>
    	var vm = new Vue({
            el: "#app",
            data: {
                price: 30,
                rawId: 2,
            },
            mounted: function () {  // 加载js时自动执行
                this.price = this.price + 10
            },
    	}
    </script>
    

2.12 axios (Ajax)

  • Vue没有Ajax, 使用axios.js库实现

  • 下载地址: https://github.com/axios/axios/releases

  • 完整写法

    axios({
        method: 'post',
        url: '/user/12345',
        data: {
            firstName: 'S',
            lastName: 'Z'
        }
    })
        .then(function(response){
        console.log(response)
    })
        .catch(function(error){
        console.log(error)
    });
    
    // 上面的写法function中不能写this, 要使用vue对象,即var vm = el: 'vm'中的vm
    // 用箭头函数即可使用this
    .then(response=>{
        this.name = this.name+'zs'
    })
    .catch(error=>{
        this.age = this.age+12
    })
    
  • GET请求

    <!-- 整个axios只有一个";", 是一个整体 -->
    <!-- .then处理请求成功的响应, .catch处理请求失败的响应 -->
    <!-- get参数写在params中 -->
    <javascript>
        axios.get('/user', {
            params: {
    			ID: 12345
            }
        })
        .then(function(response){
        	console.log(response)
        })
        .catch(function(error){
        	console.log(error)
        });
    </javascript>
    
    
  • POST请求

    <!-- post的参数直接写在{}中 -->
    <javascript>
        axios.post('/user', {
        	firstName: 'Fred',
        	lastName: 'Flint',
        })
        .then(function(response){
        	console.log(response)
        })
        .catch(function(error){
        	console.log(error)
        });
    </javascript>
    
    

三. Vue.js组件开发

3.1 ES6语法

ES6又叫ES2015, 是js的最新版本语法

  • 变量声明

    alert(iNow1)  // undefined  有预解析
    var iNow1 = 11;
    alert(iNow2)  // 没有预解析,在console中报错
    let iNow2 = 22; 
    alert(iNow3)  // 没有预解析,在console中报错
    const iNow3 = 33;  // 定义一个常量,修改常量的值报错
    
    
  • 导入与导出

    // 方法一: 导出再导入
    // index.js 中导出
    var person = {name: 'tom', age:18}
    export default {person}
    // index.js 中导入model.js中的person
    import person from 'js/model.js'
    
    //方法二: {}直接导入
    import {pserson} from 'js/model.js'
    
    
  • 简写

    name = 'zs';
    age = 18;
    let person = {
        name:name,
        age:age,
        showname:function(){
    		alert(this.name)
        },
        showage: function(){
            alert(this.age)
        }
    };
    
    // 简写为:
    let person = {
        name,
        age,
        showname(){
            alert(this.name)
        },
        showage(){
            alert(this.age)
        }
    };
    
    // 调用:
    person.showname();
    person.showage();
    
    
  • 箭头函数

    // 一般定义函数
    function fnRs(a, b){
        alert(a + b)
    }
    fnRs(1, 2)
    
    //匿名函数赋值定义
    var fnRs = function(a,b){
        alert(a + b)
    }
    
    // 箭头函数定义
    var fnRs = (a, b)=>{
        alert(a+b)
    }
    var fnRs2 = a=>{
        alert(a)
    }
    
    

3.2 vue.js组件的定义和使用

组件: 结构样式js封装在一起, 提高复用

  • 示例

    <!-- 定义组件 -->
    <javascript>
        Vue.component('breadcrumb', {
            // html, css, js
        	props: ['pos'],
        	template: '<div :class="{crumb:true, hot:isHot}" @click="hot=!isHost">
        					{{ pos }}
        			   </div>',
            data: function(){  // 独立每个组件的数据
                return {
    				isHot: true
                }
            },
            .hot{  // 定义样式
    			color: red;
            }
        	
        })
    </javascript>
    
    <!-- 使用组件(div必须用Vue接管) -->
    <div id='example'>
        <breadcrumb pos='1'></breadcrumb>  <!--面包屑导航-->
        <breadcrumb pos='2'></breadcrumb>
    </div>
    <javascript>
        var vm = new Vue({
        	el: '#example'
        })
    </javascript>
    
    

3.3 单文件组件

.vue文件

  • template.vue

    <template>
    	<div :class="{crumb:true, hot:isHot}" @click="hot=!isHost">
    		{{ pos }}
    	</div>
    </template>
    
    <script>
        export default{
            props: ['pos'],
            data: function(){
                return {
    				isHot: true
                }
            },
        }
    </script>
    
    <style>
    	.hot{  // 定义样式
    		color: red;
        }
        .crumb{
            width: 58px;
        }
    </style>
    
    
  • 使用

    .vue ==> .js

    • 终端操作
    # 环境安装
    node.js  # 新的后端语言,语法和js类似
    npm  # npm是nodejs的一个包管理器, 类似于 在pip在python环境中安装包
    vue-cli  # 安装vue-cli包
    npm install --global vue-cli
    
    # 生成Vue单页面应用项目目录
    vue init webpack my-project
    cd my-project
    npm run dev
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值