第一个vue应用
vue官网文档:Vue
head
中引入 CDN 即可完成一个简单的 vue 应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| e.g. <head> <script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script> </head>
<div class="bg"> hello world! {{msg}} </div>
<script>
new Vue({ el:'.bg', data:{ msg:'hello vue!' } })
</script>
|
模板语法
使用插值表达式将数据渲染到 DOM 里
常用的 vue 的指令:
v-bind
:给DOM绑定元素属性 ==> v-bind:href='url'
可简写为 :href="url"
v-html
: 可解析HTML并渲染在页面上
v-text
: 不能解析HTML,只能绑定一段文本内容
v-on:click
:绑定一个 click
事件 ==> v-on:click="submit()"
可简写为 @click="submit()"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| e.g.
<div id="app">
<div>{{count}}</div> <div> {{(count + 1) * 10}}</div>
<a v-bind:href="url">百度</a> <a :href="url">慕课网</a>
<div v-html="template"></div> <div v-text="template"></div>
<button type="button" v-on:click="submit()">加数字</button> <button type="button" @click="submit()">加数字</button> </div>
<script> new Vue({ el: '#app', data: { msg: 'hello vue!', count: 0, url: 'http://www.baidu.com', url1: "http://www.imooc.com", template: '<div>hello template</div>' }, methods: { submit() { this.count++; } } }) </script>
|
计算属性与侦听器
computed
:计算属性
可以监听多个变量,但是变量必须是实例中的变量
根据实例中的值变化,数据联动
watch
:侦听器
监听一个变量的变化
需要在数据变化时执行异步或开销较大的操作时使用
1 2 3 4 5 6
| e.g.
<div id="app"> {{msg}} <div>{{msg1}}</div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| e.g
var string = '111';
var app = new Vue({ el: '#app', data: { msg: 'hello vue!', another:'another hello vue!' }, watch: {
msg(newVal, oldVal) { console.log(`new: ${newVal}`); console.log(`old: ${oldVal}`); }
}, computed: { msg1(){ return `computed: ${this.msg}. another: ${this.another},${string}` } } })
app.msg = '修改 msg 这个值'; msg();
msg1();
|
条件渲染
v-if
v-else,v-else-if
v-show
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <div id="app"> {{msg}} <div v-if="count > 0"> 判断1:count大于0的话,count的值为 {{count}} </div> <div v-else-if="count < 0 && count > -5"> 判断2:count的值为 {{count}} </div> <div v-else> 判断3:count的值为 {{count}} </div> </div>
<script> var app = new Vue({ el: '#app', data: { msg: 'hello vue!', count: 0 } })
app.count = -1; app.count = 3; </script>
|
列表渲染
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <div id="app"> {{msg}} <div v-for="item in list"> <div v-if="item.age > 29"> {{item.name}} </div> </div> </div>
<script> var app = new Vue({ el: '#app', data: { msg: 'hello vue!', count: 0, list: [{ name: '李伟', age: 29 }, { name: '张三', age: 30 }] } }) </script>
|
Class 与 Style 绑定
Class的使用方式
1 2 3 4 5 6 7 8 9 10 11
| <style> .add { color: red; }
.other { font-weight: 500; } </style>
<div :class="['add','other']"></div>
|
1
| <div :class="['add','other',isactive?'active':'']"></div>
|
1
| <div :class="['add','other',{'active':isactive}]"></div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="app"> <div :class="{add: true ,other: true, isactive: true}"></div>
<div :class="classObj"></div> </div>
<script> var app = new Vue({ el: '#app', data: { msg: 'hello vue!', count: 0, classObj:{ add: true, other: true, isactive: true } } }) </script>
|
Style的使用方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="app"> <div :style="styleObj"></div> </div>
<script> var app = new Vue({ el: '#app', data: { msg: 'hello vue!', count: 0, styleObj: { color: 'red', fontSize: '20px' } } }) </script>
|
1 2 3
| <div id="app"> <div :style="[styleObj,baseStyle]"></div> </div>
|
vue核心技术
vue-cli
安装:
创建项目:
vue-router
vuex
作用:
为Vue.js开发的状态管理模式
组件状态集中管理
组件状态的改变遵循统一的规则
栗子:
Add.vue
页面新增数据,提交给 store
, list.vue
页面再从 store
中获取数据渲染页面。
通过 store.commit()
方法把数据提交给 store
中的 lists
其中 commit (type, payload, options)
接收三个参数:
type
:mutation
类型
payload
:有效载荷
options
:配置项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <div> <p>标题:</p> <input type="text" v-model="title" > <p>内容:</p> <input type="text" v-model="content" > <div> <button type="button" @click="add()" >添加</button> </div> </div> <script> import store from '@/store' export default { name: 'add', store, data () { return { title: '', content: '' } }, methods: { add () { store.commit('addItem', { title: this.title, content: this.content }) this.title = '' this.content = '' this.$router.push('/home/list') } }, components: {} } </script>
|
通过 store
中的 state
管理 lists
的状态
再通过 mutations
方法来处理需要改变的数据
addItem(state, value)
接收两个参数:
state
:获取状态里的值
value
: 获取添加后内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
export default new Vuex.Store({ state: { lists: [] }, mutations: { addItem (state, value) { state.lists.push(value) } }, actions: {}, modules: {} })
|
再获取 store
中 lists
的值 对 list.vue
页面进行数据渲染
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <div> <ul> <li v-for="(item,index) in pageLists" :key="index">{{item.title}} - {{item.content}}</li> </ul> </div>
<script> import store from '@/store' export default { name: 'list', store, data () { return {
} }, components: {
}, computed: { pageLists () { return store.state.lists } } } </script>
|
使用 vscode 创建 vue 模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| { "Print to console": { "prefix": "vue", "body": [ "<template>", " <div>\n", " </div>", "</template>\n", "<script>", "export default {", " name: '${1:component_name}',", " data () {", " return {\n", " }", " },", " components: {\n", " }", "}", "</script>\n", "<style lang=\"${2:scss}\" scoped>\n", "</style>", ""
], "description": "Log output to console" } }
|
vscode 实现 vue 代码格式化配置项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| "vetur.format.defaultFormatterOptions": { "js-beautify-html": { "wrap_attributes": "force-expand-multiline" }, "prettyhtml": { "printWidth": 100, "singleQuote": true, "wrapAttributes": false, "sortAttributes": false } }, "prettier.semi": false, // 去掉代码结尾的分号 "prettier.singleQuote": true, // 使用单引号替代双引号 "vetur.format.defaultFormatter.html": "js-beautify-html", //格式化.vue中html "vetur.format.defaultFormatter.js": "vscode-typescript", //让vue中的js按编辑器自带的ts格式进行格式化 "javascript.format.insertSpaceBeforeFunctionParenthesis": true,//让函数(名)和后面的括号之间加个空格
|