首页 > 软件开发 > vue > vue2.0教程

vue2.0教程

1.padStart函数(字符串格式化)

padStartFunc(data) {	//可以写成过滤器,使用该函数必须data必须是字符串
	this.msg = data.padStart(2, '0');
}

2.单选框

<label class="radio-inline"> <input type="radio"  value="男" v-model="user.u_sex"> 男  </label> 
<label class="radio-inline"> <input type="radio" value="女" v-model="user.u_sex"> 女 </label>

3.自定义键盘修饰符

<!-- 当焦点在该按钮上时,按下f12(对应键盘码113)就可以出发show函数 -->
<button @click="clickMe" @keyup.113="show">点我弹窗</button>

<!-- 也可以自定义键盘码指令简化开发,配合js -->
<button @click="clickMe" @keyup.f2="show">点我弹窗</button>

//自定义键盘码
<script>
	Vue.config.keyCodes.f2 = 113;
</script>  

键盘码大全:https://blog.csdn.net/dyllove98/article/details/8728657

4.自定义指令与钩子函数(bind inserted updated …)

1)公共指令:

<!-- html代码,v-focus="msg"是自定义指令,其中注意msg是绑定在data里的变量,有别于v-focus="'msg'" -->
<input id="search" v-model="search" type="text" v-focus="msg" />

//js代码
//自定义全局指令
Vue.directive('focus', {
	bind: function (el, binding) {
    	el.style.color = 'red';
        el.value = binding.value;
        // 和样式相关的操作最好放在绑定函数
    },
    inserted: function (el, binding) {
        el.focus();
        //和js相关的操作最好放在插入函数,只触发一次
    },
    updated: function (el, binding) {
        //可多次触发
    }
});

2)私有指令:

var vm = new Vue({
	el: "#app",
    data: {
    	...
    },
    directives: { //定义私有指令
        'fontweight': {		//完整形式,因为bind和updated使用比较频繁,推荐使用下面的简写形式
        	bind: function (el, binding) {
            	el.style.fontWeight = binding.value;
            },
            inserted: function (el, binding) {
                el.style.fontWeight = binding.value;
            },
            updated: function (el, binding) {
                el.style.fontWeight = binding.value;
            }
        },
        'fontsize':function(el, binding){   //简写形式,相当于在bind和updated里都写了以下代码
            el.style.fontsize = parseInt(binding.value) + 'px';
        }

    }
});

5.生命周期函数(钩子函数)

<!-- html代码 -->
<div id="app">
	<h3 id="h3">{{msg}}</h3>
    <input type="button" value="修改msg" @click="msg = 'no'">
</div>

//js代码
var vm = new Vue({
	el: "#app",
	data: {
		msg: "ok"
	},
	methods: {
		show(data) {
			console.log(data + "执行show方法");
		}
	},
	beforeCreated() {
		//第一个生命周期函数(在el,data,methods等声明之前就会运行,vue实例初始化前运行的函数)
		//以下内容均不会被打印出来
		console.log("beforeCreated-" + this.msg);
		this.show("beforeCreated-");
	},
	created() { //常用
		//第二个生命周期函数(在el,data,methods等声明之后就会运行,vue实例初始化后运行的函数)
		//以下内容会被打印出来
		console.log("created-" + this.msg);
		this.show("created-");
	},
	beforeMount() {
		//第三个生命周期函数,页面模板已经在内存中编译完成,但是尚未渲染到页面中运行的函数
		//将会输出beforeMount-{{msg}}而并非页面中的值,无法取到页面中的元素,因为页面还未渲染,此时页面还是旧页面
		console.log("beforeMount-" + document.getElementById("h3").innerText);
	},
	mounted() { //常用
		//第四个生命周期函数,页面已渲染
		//页面已渲染,可以输出"mounted-ok",
		//如果要通过某些插件操作页面上的DOM节点,最早要在mounted中进行
		console.log("mounted-" + document.getElementById("h3").innerText);
	},
	beforeUpdate() {
		//第五个生命周期函数,运行阶段触发的函数,会根据data改变(数据被更新)触发0-∞次
		//点击按钮修改msg的值,会输出beforeUpdate-ok,而此时msg会被更改为no,故输出的是旧数据
		console.log("beforeUpdate-" + document.getElementById("h3").innerText);
	},
	updated() {
		//第六个生命周期函数
		//点击按钮修改msg的值,updated-no,输出的是新数据
		console.log("updated-" + document.getElementById("h3").innerText);
	},
	beforeDestroy() {
		//第七个生命周期函数
		//销毁前执行,仍然可以使用vue里的所有组件
	},
	destroy() {
		//第八个生命周期函数
		//销毁后执行,vue里的所有组件都已经销毁了,不可使用
	}
});

5.模块化与组件(以登录组件和注册组件为例)

1) 全局组件

<!-- CSS代码-可以省略,这里作动画切换 -->
<style>
	<!-- 进入后和离开后的状态一致 -->
    .v-enter,
    .v-leave-to {		
        opacity: 0;
        transform: translateX(150px);
    }

	<!-- 进入过程和离开过程的状态一致 -->
    .v-enter-active,
    .v-leave-to {		
        transition: all 0.5s ease;
    }
</style>

<!-- HTML代码 -->
<div id="app">
	<!-- 引入方式1:使用占位符引入组件,这里的comName是变量需要定义 -->
	<!-- transition标签用来提供动画切换效果,mode属性设置切换方式 -->
	<transition mode="out-in">
        <component :is="comName"></component>
    </transition>

	<!-- 引入方式2:直接以标签形式引入 -->
	<login></login>
	<register></register>
</div>

<!-- HTML代码,组件模板必须在vue控制范围之外定义 -->
<template id="login">
    <h1>登陆组件</h1>
</template>
<template id="register">
    <h1>注册组件</h1>
</template>

//JS代码
<script>
	var vm = new Vue({		//vue控制块
        el: "#app",
        data: {
            comName: "login"	//默认显示登录组件
        }
    });

    Vue.component("login", {	//登录组件
        template: "#login",
		data() {	//组件拥有自己的数据,但是必须是以函数的形式表示并且配有返回值
            return {
                count: 0
            };
        },
        methods: {
            //组件拥有自己的方法
        }
    });
    Vue.component("register", {		//注册组件
        template: "#register"
    });
</script>

2) 私有组件

<!-- HTML代码 -->
<div id="app">
	<login></login>
</div>

//JS代码
<script>
    var vm = new Vue({
        el: "#app",
        data: {
			//...
        },
        methods: {
			//...
        },
        components: { //定义示例内部私有组件
            login: {
                template: '#temp'
            }
        }
	});
</script>

6.父子组件之间传值

<!-- HTML代码 -->
<div id="app">
	<!-- 在父区域使用子组件时,通过v-bind引用父变量名为msg的变量,通过v-on引用父方法名为show的方法 -->
    <com1 v-bind:parentmsg="msg" v-on:func="show"></com1>
</div>
<template id="tem1">
	<!-- 引用后,可以在该子组件使用刚刚赋予的parentmsg名称即父变量msg的值,而func也可作为方法在myclick方法调用 -->
    <div>
        <h1>这是子组件 --- {{parentmsg}}</h1>
        <input type="button" value="点击触发父组件传递过来的func方法" @click="myclick">
    </div>
</template>

//JS代码
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg: "这是父组件"
        },
        methods: {
            show(data1,data2) {		//子组件可以传两个值过来
                console.log("调用父组件show方法:"+data1+data2);
            }
        },
        components: {
            com1: {
                data() { //子组件自己的值,可读可写
                    return {
                        title: "123",
                        content: "qqq"
                    }
                },
                methods:{
                    myclick(){
                        //通过emit触发父组件传递过来的func方法来触发show方法,第二个参数开始是该子组件向父组件传过去的值
                        this.$emit("func",this.title,this.content);
                    }
                },
                template: "#tem1",
                props: ['parentmsg'] //父组件传递过来的值的名称,只读不可写
            }
        }
    });
</script>

7.$refs的使用

<!-- HTML代码 -->
<div id="app">
    <input type="button" value="获取元素" @click="getElement">

    <h3 id="myh3" ref="myh3">哈哈哈</h3>

    <login ref="login"></login>
</div>

//JS代码
<script>
    Vue.component("login", {
        data() {
            return {
                msg: "son msg"
            }
        },
        methods: {
            show() {
                console.log("son-showFunction");
            }
        }
    })

    var vm = new Vue({
        el: "#app",
        methods: {
            getElement() {
				//$refs可以获取DOM元素和组件
                console.log(this.$refs.myh3.innerText);
				//子组件的msg值
                console.log(this.$refs.login.msg);
				//子组件的show方法
                this.$refs.login.show();
            }
        }
    });
</script>

8.路由基本使用与传值

<!-- 切换动画样式代码 -->
<style>
    .router-link-active {
        color: red;
        font-weight: 800;
        font-style: italic;
        text-decoration: underline;
    }

    .v-enter,
    .v-leave-to {
        opacity: 0;
        transform: translateX(140px);
    }

    .v-enter-active,
    .v-leave-active {
        transition: all 0.5s ease;
    }
</style>

<!-- HTML代码 -->
<div id="app">
    <!-- 默认渲染为a标签,以下展示两种传值方式 -->
    <router-link to="/login?id=10">登录</router-link>
    <router-link to="/register/12/ls">注册</router-link>

    <!-- 这是vue-router提供的元素,占位符 -->
    <transition mode="out-in">
        <router-view></router-view>
    </transition>
</div>

//JS代码
<script>
    //组件模板对象
    var login = {
        template: "<h1>登录组件---{{$route.query.id}}</h1>",
        created(){
            console.log(this.$route.query.id);
        }
    }
    var register = {
        template: "<h1>注册组件---{{$route.params.id}}---{{$route.params.name}}</h1>",
        created(){
            console.log(this.$route.params.id);
        }			
    }

    //创建一个路由对象
    var router = new VueRouter({
        //routes 是路由匹配规则,必须有两个属性
        //属性1 是path,监听哪个路由链接地址
        //属性2 是component,表示path对应的component对应的那个组件,其属性值必须是一个模板对象不能是名称
        routes: [{
                path: "/",
                redirect: "/login"
            },
            {
                path: "/login",
                component: login
            },
            {
                path: "/register/:id/:name",
                component: register
            }
        ],
        //配置高亮类
        linkActiveClass: "btn btn-success"
    });

    var vm = new Vue({
        el: "#app",
        router //注册路由规则对象,监听url变化展示对应组件
    });
</script>

9.嵌套路由

<!-- HTML代码 -->
<div id="app">
    <router-link to="/account">ACCOUNT</router-link>
    <router-view></router-view>
</div>
<template id='account'>
    <div>
        <h1>这是ACCOUNT组件</h1>
        <router-link to="/account/login">登录</router-link>
        <router-link to="/account/register">注册</router-link>
        <router-view></router-view>
    </div>
</template>

//JS代码
<script>
    //组件模板对象
    var account = {
        template: "#account"
    }
    var login = {
        template: "<h1>登录组件</h1>"
    }
    var register = {
        template: "<h1>注册组件</h1>"
    }

    //创建一个路由对象
    var router = new VueRouter({
        routes: [{
            path: "/account",
            component: account,
            children: [{	//在此嵌套孩子组件,采用相对寻址,不加斜杠!
                    path: "login",
                    component: login
                },
                {
                    path: "register/:id/:name",
                    component: register
                }
            ]
        }]
    });

    var vm = new Vue({
        el: "#app",
        router //注册路由规则对象,监听url变化展示对应组件
    });
</script>

10.watch监视属性(可以监视DOM之外的数据变化,例如下面监视了url的变化,参照第九点加上watch监视)

<script>
    var vm = new Vue({
        el: "#app",
        watch:{
            "$route.path"(newVal,oldVal){	//重点:以要监听的属性名作为函数名称即可监听该属性
                if(newVal == "/account/login"){
                    console.log("欢迎进入登陆界面");
                }else if(newVal == "/account/register"){
                    console.log("欢迎进入注册界面");
                }
            }
        },
        router //注册路由规则对象,监听url变化展示对应组件
    });
</script>

11.computed的使用

<script>
    var vm = new Vue({
        el: "#app",
        data: {
            data1:"",
            data2:""
        },
        computed: {
            result(){
                //result的值随着data1和data2的改变而改变,同样result可以当作普通属性去绑定,如v-model="result"和{{result}}均可以直接在页面使用
                return this.data1+this.data2;
            }
        }
    });
</script>

12.webpack打包命令即ES6引入命令

webpack .\src\main.js -o .\dist\bundle.js
//导入jquery,ES6中导入模块的方式
import $ from 'jquery'

13.webpack配置文件webpack.config.js的编写

//node语法,webpack是由node.js编写的故都可通用node语法
const path = require('path');

module.exports = {  
    entry: path.join(__dirname,'./src/main.js'), //入口,表示要打包哪个文件
    output:{
        path: path.join(__dirname,'./dist'), //指定打包好的文件输出到哪个目录中去
        filename: 'bundle.js'   //打包后文件的名称
    }
}

猜你喜欢

迷你音乐播放器组件

迷你音乐播放器组件

vue跳转

vue跳转

谈谈vue的ssr的几种方案,解决seo难题

谈谈vue的ssr的几种方案,解决seo难题

vue全局配置

vue全局配置

vue模板中使用三元运算条件渲染数据

vue模板中使用三元运算条件渲染数据

0 条评论

img 登陆后才能评论哦~