vue快速上手
2018-11-04 本文已影响15人
labi3285
vue是一个基于响应式编程思想、模块化设计实现的js框架,可以大大简化开发,是前端开发的首选框架。
1、基础语法
下面这个demo演示了vue的基本使用:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Demo</title>
<!-- 这个是国内的vue cdn库 -->
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<!-- 插值 -->
<div>{{ test_message }}</div>
<!-- 插值html模板 -->
<div v-html="test_vhtml"></div>
<!-- 遍历 -->
<div>
<li v-for="user in test_users">
{{ user.name }}, {{ user.age }} years old.
</li>
<li style="list-style: none" v-for="(user, i) in test_users" :key="i">
{{ i }}: {{ user.name }}, {{ user.age }} years old.
</li>
</div>
<!-- 插值方法 -->
<div>{{ test_func() }}</div>
<!-- 计算 -->
<div>1 + 2 = {{ 1 + 2 }}</div>
<div>{{ test_bool ? "YES" : "NO" }}</div>
<!-- 条件分支 -->
<div v-if="test_bool">see me if test_bool is true</div>
<div v-else>see me if test_bool is false</div>
<!-- 绑定值 -->
<div v-bind:id="'xxx' + test_bind_id">a h1 with id xxx-{{ test_bind_id }}</div>
<a v-bind:href="test_url">a baidu link</a><br/>
<!-- 简写形式 -->
<div :id="'xxx' + test_bind_id">a h1 with id xxx-{{ test_bind_id }}</div>
<a :href="test_url">a baidu link</a><br/>
<!-- 绑定事件 -->
<button v-on:click="test_click">a button</button><br/>
<button v-on:click="test_click_count += 1">a button</button><span>{{ test_click_count }}</span><br/>
<!-- 事件细节 -->
<button v-on:click.once="test_click">a once click button</button><br/>
<input v-on:keyup.enter="test_summit" placeholder="tap enter to summit"><br/>
<!-- 简写形式 -->
<button @click="test_click">a button</button><br/>
<!-- 双向绑定 -->
<input v-model="test_input_value"><span>{{ test_input_value }}</span><br/>
<!-- 多选绑定 -->
<input type="checkbox" id="check_a" value="a" v-model="test_options"><label for="check_a">A</label>
<input type="checkbox" id="check_b" value="b" v-model="test_options"><label for="check_b">B</label>
<input type="checkbox" id="check_c" value="c" v-model="test_options"><label for="check_c">C</label>
<label>{{ test_options }}</label><br />
<!-- 列表绑定 -->
<select v-model="test_select">
<option value="">choose</option>
<option value="a">A</option>
<option value="b">B</option>
</select>
<label>{{ test_select }}</label><br/>
<!-- 绑定样式 -->
<div v-bind:style="{ color: test_color }">test style</div>
<div v-bind:class="{ test_class_active: test_bool }">test class</div>
<!-- 过滤器 -->
<div v-bind:id="'id-' + test_bool | test_filter_bool">a div with id id-{{ test_bool | test_filter_bool }}</div>
<div>{{ test_message }} -> {{ test_message | test_filter_upcase }}</div>
<!-- 监听器 -->
<input v-model="test_money_dollar"><span>{{ test_money_yuan }}¥</span><br />
</div>
<style>
.test_class_active {
color: green;
}
.test_class_disable {
color: gray;
}
</style>
<script>
new Vue({
el: '#app',
data: {
test_message: "a test message",
test_color: "#ff0000",
test_vhtml: "<h5>a h5</h5>",
test_bool: true,
test_click_count: 0,
test_money_yuan: 0,
test_money_dollar: 0,
test_users: [
{ name: 'Tom', age: 12 },
{ name: 'Helen', age: 11 },
{ name: 'Jack', age: 13 }
],
test_options: [],
test_select: "",
test_bind_id: 1,
test_url: "https://www.baidu.com",
test_input_value: "the input text"
},
filters: {
test_filter_upcase: function (value) {
if (!value) return ''
value = value.toString()
return value.toUpperCase()
},
test_filter_bool: function (value) {
if (value.booleanValue) {
return "true"
} else {
return "false"
}
}
},
watch: {
test_money_dollar: function (value) {
this.test_money_yuan = value * 6
}
},
methods: {
test_func: function () {
return "test_func(): " + this.test_message;
},
test_click: function () {
alert("test_click()")
},
test_summit: function () {
alert("test_summit()")
}
}
})
</script>
</body>
</html>
2、模块化
a、注册组件
<div id="app">
<!-- 引用 -->
<test_component_01></test_component_01>
<test_component_02></test_component_02>
</div>
<script>
// 注册全局组件
Vue.component('test_component_01', {
template: '<div>test component 01</div>'
})
// app实例
new Vue({
el: '#app',
// 注册局部组件
components: {
'test_component_02': {
template: '<div>test component 02</div>'
}
}
})
</script>
b、模块间传值(父 --> 子),变量绑定及声明
<div id="app">
<input v-model="parent_text"><br/>
<!-- ② 绑定变量 -->
<child v-bind:text_from_parent="parent_text"></child>
</div>
<script>
Vue.component('child', {
// ① 声明变量
props: ['text_from_parent'],
template: "<span>{{ text_from_parent }}</span>"
})
new Vue({
el: '#app',
data: {
parent_text: "parent text"
}
})
</script>
props后面的参数也可以以map的形式提供,以实现参数限定,例如:
props: {
varA: Number,
varB: [String, Number],
varC: {
type: Number,
required: true,
default: 1
},
varD: {
validator: function (value) {
return value > 10
}
}
}
c、模块间传值(子 --> 父),事件监听
<div id="app">
<div>{{ count }}</div>
<!-- ② 注册事件监听 -->
<child v-on:update="childRespondUpdate"></child>
</div>
<script>
Vue.component('child', {
template: '<button v-on:click="onClick">click me to change parent</button>',
data: function () {
return {
count: 0
}
},
methods: {
onClick: function () {
this.count += 1
// ① 在子控件更新的方法中,触发事件
this.$emit('update', this.count)
}
},
})
new Vue({
el: '#app',
data: {
count: 0
},
methods: {
// ③ 执行更新
childRespondUpdate: function (value) {
this.count = value
}
}
})
</script>
3、路由(router)
路由是vue的一个页面切换组件,基本使用如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Router Demo</title>
<!-- 这个是国内的vue cdn库 -->
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<!-- vue router库 -->
<script src="https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script>
</head>
<body>
<div id="app">
<!-- 普通链接 -->
<router-link to="/a">a-path</router-link>
<router-link to="/b">b-path</router-link>
<br/>
<!-- 通过名字访问 -->
<router-link v-bind:to="{ name:'a' }">a-name</router-link>
<router-link v-bind:to="{ name:'b' }">b-name</router-link>
<br/>
<!-- 带参数 -->
<router-link v-bind:to="{ path:'/a', query: { param: 'value' } }">a-param</router-link>
<router-link v-bind:to="{ path:'/b', query: { param: 'value' } }">b-param</router-link>
<br/>
<!-- 指定tag类型 -->
<router-link to="/a" tag="button">a-tag</router-link>
<router-link to="/b" tag="button">b-tag</router-link>
<br/>
<!-- router区域 -->
<router-view></router-view>
</div>
<script>
// 创建router
const router = new VueRouter({
routes: [
{ path: '/a', name: 'a', component: { template: '<div>A</div>' } },
{ path: '/b', name: 'b', component: { template: '<div>B</div>' } },
{ path: '/a/b', name: 'c', component: { template: '<div>C</div>' } }
]
})
// 通过router初始化
const app = new Vue({
router: router
})
// 手动挂载
.$mount('#app')
</script>
</body>
</html>