文本插值使用双大括号的形式:
其中括号内的值会被解析成数据对象中的值,如果数据对象中的值发生变化,括号内的值也会联动发生变化
如果只需要渲染一次数据,后续的数据变化不再关心,则:
上述方式如果test的值是html片段,则会原封不动的替换,而不是替换成html的形式
如果要增加html解析的功能,则:
同时,双大括号还可以在标签内使用:
<div class = '{{ test }}'></div>同时,双大括号同时也接收表达式,包含js表达式和过滤器
<!--JS表达式--> {{ true : 1 ? 0 }} {{ str.split(',') }} <!--管道filter--> {{ example | toUpperCase }} ===>这里的toUpperCase 就是过滤器,是指是一个函数,返回全大写 {{ example | filterA | filterB }} ====>允许过滤器串联 {{ example | filterA a b }} ====>允许传入参数 a b 用空格隔开但是如果大括号内不是多条语句或者声明语句,而不是表达式,则不支持:
<!--JS无效格式--> {{ var log = '123' }} ====> 这是语句,不是表达式,不起作用 {{ if(true) { str } else { str1 } }} ====>虽然if else中的是字符串的变量,但是这个不是一个表达式,而是一段语句指令是带有v-前缀的特殊属性,其值绑定了数据对象中的值或者表达式
v-if指令可以完全根据表达式的值来在dom中生成或者移除一个元素(false移除,true添加) 注意:如果含有v-if属性的标签还有子标签,会一并添加或者移除
<template> <div class="about"> <div v-if="isDisplay"> <p>显示内容</p> <button @click="switchDiv">隐藏</button> </div> </div> </template> <script> export default { name: 'test', data () { return { isDisplay:true } }, methods:{ switchDiv:function(){ this.isDisplay = false; } } } </script>v-show指令是根据响应数据的值来显示和隐藏HTML元素,比如: v-show的赋值为false的时候,元素上会多一个内联样式:style = 'display: none ' v-show和v-if的区别在于v-show是通过css来控制,无论true或者false,这个HTML元素都会存在于DOM中
总结: v-if是惰性的,只有true的时候才会被编译,会有很高的切换消耗 v-show元素始终被保留,会有很高的初始渲染消耗
用来在表单控件是实现数据的双向绑定(具体每个标签略)
在默认情况下,v-model中的数据会与数据实时同步,但是可以使用lazy数据将其改到change事件上来:
<!-- 通过添加lazy属性,在input更改的值会在用户输入enter或者离开光标后才会刷新 --> <input type='text' v-model='msg' lazy> {{ msg }}当然也可以使用debounce属性来设置一个最小延时,每次更改数据后延时指定时间后菜户同步刷新数据
<!-- --> <input type='text' v-model='msg' debounce = '50000'> {{ msg }}基于源数据重复渲染元素:
<ul> <!--customer of customers也可以--> <li v-for = '(customer,index) in customers' :id = 'index'> {{ customer.name }} {{ $index }} //呈现数据索引(customers中的第几个元素) {{ id }} //和$index的方式类似 </li> </ul>v-for不仅可以渲染数组,还可以渲染对象:
<ul> <!--customer of customers也可以--> <!-- object:{ first: 'x', second: 'y' } --> <li v-for = 'value in object' > {{ vaule }} //会依次输出x和y </li> </ul>更新元素的textContent
<span v-text = 'msg'></span> 等价于 <span>{{ msg }}</span>更新元素的innerHTML,即: {{{ content }}} 等价于 v-html = ‘content’
强制将html的属性值绑定至vue数据对象中 v-bind:src = ‘content’ 等价于 :src = ‘content’
<p :class = 'somthing'></p> <!--双向绑定--> <p :class.sync = 'something'> </p> <!--单次绑定--> <p :class.one= 'something'></p>VUE中数据绑定的语法是可以自定义的,src/config.js文件中包含了一些语法格式,例如:
原文件src/config.js: let delimiters = ['{{','}}'] let unsafeDelimiters = ['{{{','}}}'] 我们可以在main.js中更改: Vue.config.delimters = ['<%','%>'] 如果更改成这个,以后数据绑定的代码为: <% test %>过滤器是支持串联的: {{ value | filterA | filterB … }} 在过滤器内是没有this引用的,即: this ==undefined
使用npm安装vue-cli:
npm i vue-cli -g进入对应目录创建项目:
vue init webpack my-project列出所有可以使用的模板:
vue list开发环境下运行vue 这个指令是在package.json的script属性设置的,实质上是由npm引导执行入口程序dev-server.js来完成加载过程
npm run dev生产环境编译
npm run build我们可以通过webpack的resolve来配置长路径或者…/这些相对路径,在webpack.base.config.js中:
modult.export = { entry: {}. ..... resolve: { extensions: ['','.js'], alias: { //使用别名来代替一些长路径或者比较常出现的长字符 'bs-select': '长路径' '~': '../' } } }在一个项目中的程序入口一般不只有一个,所以需要增加多个类似main.js的入口文件
/index请求index.html /admin请求admin.html 这些入口js文件会被生成至启动页的script标签内 在build/webpack.base.conf.js文件中:
module.export = { entry: { //app、admin这些名称可以在后面定义HtmlWebpackPlugin中使用 app: './src/main.js', admin: './src/admin-main.js' } }webpack中的HtmlWebpackPlugin插件用于生成html入口页面并将js和css文件的引用地址写入到入口html中的对应位置 在build/webpack.base.conf.js文件中:
new HtmlWebpackPlugin({ filename: 'admin.html', template: 'admin.html', inject: true, //要与entry一致 chunks: ['admin'] }),如果需要将上面的admin-main生成在另一个html入口页,则需要再多配置一个HtmlWebpackPlugin对象,其中的chunks必须使用在entry中定义的admin 最后:build/webpack.prod.conf.js文件中增加
module.exports = { build: { env: require('./prod.env'), index: path.resolve(__dirname, '../dist/index.html'), admin: path.resolve(__dirname, 'admin.html'), ..... } }最后访问/index和/admin则是两个不同的入口页面