vue.js 插件 setting--> plugins 搜索vue,下载安装
如果想要高亮显示*.vue文件,可以在File Types 选项里找到HTML,然后在下方手动添加*.vue,这样就有高亮啦。
vue2.0 入门
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>vue</title>
<style>
h1{border-bottom: 1px solid green;}
</style>
<script src="//cdn.bootcss.com/vue/2.0.3/vue.js"></script>
</head>
<body>
<!-- 1.最简 vue -->
<h1>1.最简vue</h1>
<div class="app">
{{message}}
</div>
<script>
var app= new Vue({
el:'.app', // 这里是 el
data:{
message:'hello vue'
}
});
app.message='how are you'; // 可动态改内容
</script>
<!-- 2 第二种绑定 v-bind -->
<h1>2 第二种绑定 v-bind</h1>
<div id="app-1">
<span v-bind:title="message" >mouseover me </span><br/> <!-- 给span 添加一个title属性 -->
<span v-bind:id="id">i am span</span> <br/> <!-- 给span 添加一个 id 属性 -->
<span :id="id2">the second span</span> <!-- 简写为 : -->
</div>
<script>
var app1=new Vue({
el:'#app-1',
data:{
message:'how are you'+ new Date(),
id:'span1',
id2:'span2'
}
});
</script>
<!-- 3 。if -->
<h1>3.if</h1>
<div id="app2">
<p v-if="seen">i will show</p>
<p v-if="show">i won't shown</p>
</div>
<script>
var app2=new Vue({
el:'#app2',
data:{
seen:true,
show:false
}
});
</script>
<!-- 4 for -->
<h1>4 v-for</h1>
<div id="app3">
<ul>
<li v-for="list in lists">
{{list.key}}
</li>
</ul>
</div>
<script>
var app3=new Vue({
el:'#app3',
data:{
lists:[ /* 数组对象*/
{key:'a'},
{key:'b'},
{key:'c'}
]
}
});
app3.lists.push({key:'d'});
</script>
<!-- 5 .v-on:click 事件绑定-->
<h1>5 .v-on:click 事件绑定</h1>
<div id="app5">
<p>{{message}}</p>
<button v-on:click="test">btn</button>
<button @click="test2">btn2</button> <!-- 事件绑定 简写为 @ -->
</div>
<script>
var app5=new Vue({
el:'#app5',
data: {
message: 'test one',
},
methods:{ /* 注意关键字 */
test: function () {
this.message+=' is ok';
},
test2: function () {
this.message+=' is error';
}
}
});
</script>
<!-- 6 v-model 表单-->
<h1>6 v-model 表单</h1>
<div id="app6">
<p>{{message}}</p>
<input type="text" v-model="message"/>
</div>
<script>
var app6=new Vue({
el:'#app6',
data:{
message:'input your name'
}
});
</script>
<!--7 组件-->
<h1>7 组件</h1>
<div class="app7">
<ul>
<item></item>
</ul>
</div>
<script>
Vue.component('item',{
template:'<li>this is content</li>'
});
var app7=new Vue({
el:'.app7'
});
</script>
<!-- 7.0 组件 props -->
<h1>7.0组件 props 传值</h1>
<div class="app70">
<my-component v-bind:message="message"></my-component>
</div>
<script>
Vue.component('my-component',{
props:['message'],
template:'<div>{{message}}</div>'
});
var app=new Vue({
el: '.app70',
data: {
message: 'this is the message'
}
});
</script>
<!-- 7.1 组件 props -->
<h1>7.1组件 props</h1>
<div class="app71">
<ul>
<item v-for="list in lists" v-bind:list="list"></item> <!-- 把 props 的list 跟 html的 list绑定 -->
</ul>
</div>
<script>
Vue.component('item',{
props:['list'], /* 数据传递*/
template:'<li>{{list.key}}</li>'
});
var app7=new Vue({
el:'.app71',
data:{
lists:[
{key:'aa'},
{key:'bb'},
{key:'cc'}
]
}
});
</script>
<h1>8 vue 实例 属性与方法</h1>
<code>var vm = new Vue({
// 这就是vue实例
});
</code>
<h2>属性和方法</h2>
<div class="app8">
{{a}}
</div>
<script>
var data={a:1}
var vm=new Vue({
el:'.app8',
data:data /* 可以把数据独立出来*/
});
vm.a=2; // 可以改a的值
data.a=3; // 可以改a 的值
</script>
<h1>9.计算属性 computed </h1>
<p>一般用计算机属性解决,计算属性是基于它的依赖缓存,即已有数据,只要 message不变,访问 res 会马上出结果,不用执行函数</p>
<div class="app9">
<p>first:{{message}}</p>
<p>res:{{res}}</p>
</div>
<script>
var vm=new Vue({
el:'.app9',
data:{
message:'hello'
},
computed:{
res: function () {
return this.message.split('').reverse().join('') /* 计算属性基于已有数据*/
}
}
});
</script>
<h1>9.1计算属性 computed vs method</h1> <div class="app91">
<p>first:{{message}}</p>
<p>res:{{res()}}</p> <!-- 这里要加个 () ! -->
<button @click="res2">btn</button>
</div>
<script>
var vm=new Vue({
el:'.app91',
data:{
message:'hello'
},
methods:{
res: function () {
return this.message.split('').reverse().join(''); // return
},
res2: function () { // 坑!
this.message=this.message.split('').reverse().join('');
// this.message+=' xx';
}
}
});
</script>
</body>
</html>
vue2.0 入门2
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
p{border-bottom: 1px solid green;line-height: 30px;}
.color{color:red;}
.fontsize{font-size: 30px;}
</style>
<script src="//cdn.bootcss.com/vue/2.0.3/vue.js"></script>
</head>
<body>
<p>1.class 切换 v-bind 可以简写为 : </p>
<div class="app1">
<!--<span v-bind:class="{color:isColor,fontsize:isFontsize}">test</span>-->
<span :class="{color:isColor,fontsize:isFontsize}">test1</span>
</div>
<script>
var app1=new Vue({
el:'.app1',
data:{
isColor:true,
isFontsize:false
}
});
</script>
<p>1.1 绑定对象样式 +计算属性【主要】 其他形式看手册</p>
<div class="app2">
<span :class="classObject">test2</span>
</div>
<script>
var app2=new Vue({
el:'.app2',
data:{
isColor:false,
isFontsize:true
},
computed:{
classObject: function () {
return{
color:this.isColor,
fontsize:this.isFontsize
}
}
}
});
</script>
<p>3 条件渲染 v-if 看手册</p>
<p>4 v-for 数组对象,+相同信息,索引</p>
<div class="app4">
<ul>
<li v-for="(list,index) in lists"> <!-- list 要写在 index 前面 -->
{{otherMessage}}{{index}} : {{list.key}} <!-- 添加相同信息,索引 -->
</li>
</ul>
</div>
<script>
var app4=new Vue({
el:'.app4',
data:{
otherMessage:'list: ',
lists:[ /*数组对象*/
{key:'a'},
{key:'b'},
{key:'c'},
]
}
});
</script>
<p>4.1 v-for 对象</p>
<div class="app41">
<ul>
<li v-for="value in person">
{{value}} <!-- 直接 value 不方便取指定数据-->
</li>
</ul>
</div>
<script>
var app41=new Vue({
el:'.app41',
data:{
person:{
name:'xiao',
age:12,
hobby:'swiming'
}
}
});
</script>
<p>5 列表渲染有一个完整的todo list的例子先跳过、数组特性也跳过;</p>
<p>6.事件处理 v-on 简写 @ 可传参数、event. preventDefault()、按键</p>
<div class="app6">
<button @click="test('haha')">btn</button>
<form @submit.prevent="submit"></form> <!-- event. preventDefault() 封装了-->
<input placeholder="输入回车就可以提交" @keyup.enter="submit"> <!--输入回车调用提交-->
</div>
<script>
var app6=new Vue({
el:'.app6',
data:{ },
methods:{
test: function (mes) {
alert(mes+" is here");
},
submit: function () {
alert("ok。。");
}
}
});
</script>
<p>7.表单 v-model 至少要设置 data.message='' </p>
<div class="app7">
<input type="text" v-model="message"/>{{message}}
<input type="checkbox" v-model="checked" id="checkbox"/> <label for="checkbox">{{checked}}</label> </div>
<script>
var app7 = new Vue({
el:'.app7',
data:{
message:'',
checked:false
}
});
</script>
<p>8.1全局组件要在实例前</p>
<div class="app81">
<item></item>
</div>
<script>
Vue.component('item',{ /* 全局注册,也可以局部注册 */
template:'<div>this is component</div>'
});
var app81=new Vue({
el:'.app81'
});
</script>
<p>8.2组件局部注册 is 组件 </p>
<div class="app82">
<item></item>
</div>
<script>
var child={
template:'<div>this is xxx</div>'
}
var app82=new Vue({
el:'.app82',
components:{ /* 要加一个s methods 方法也要加一个s */
'item':child
}
});
/*<table>
<tr is="my-row"></tr> 某些标签对组件识别不了时,用is
</table>*/
</script>
<p>8.3 $emit</p>
<div id="counter-event-example">
<span>{{ total }}</span>
<button-counter v-on:increment="incrementTotal"></button-counter> <!-- 子组件再绑定事件关联父组件-->
<button-counter v-on:increment="incrementTotal"></button-counter>
</div>
<script>
Vue.component('button-counter', {
template: '<button @click="increment">{{ counter }}</button>',
data: function () {
return {
counter: 0
}
},
methods: {
increment: function () { /* 子组件绑定事件 */
this.counter += 1
this.$emit('increment') /* 子组件要跟父组件通信*/
}
},
})
new Vue({
el: '#counter-event-example',
data: {
total: 0
},
methods: {
incrementTotal: function () {
this.total += 2
}
}
})
</script>
</body>
</html>
vue2.0 入门3
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
p{line-height: 40px;border-bottom: 1px solid green;}
</style>
<script src="//cdn.bootcss.com/vue/2.0.3/vue.js"></script>
</head>
<body>
<p>1.标准</p>
<div class="app">
{{message}}
</div>
<script>
var app=new Vue({
el:'.app',
data:{
message:123
}
});
</script> <p>2. x-templates</p>
<div class="app2">
<my></my>
</div>
<script type="text/x-template" id="test">
<h1>hahahah</h1>
</script>
<script>
Vue.component('my',{
template:'#test'
})
var app2=new Vue({
el:'.app2'
}); </script>
<p>3.自定义指令</p>
<div class="app3"> <input type="text" v-focus/>
</div>
<script>
var app3=new Vue({
el:'.app3',
directives:{
focus:{
inserted: function (el) {
el.focus()
}
}
}
});
</script>
</body>
</html>
组件 props
<p>7.1组件 props 【】</p>
<div class="a71">
<ul>
<item v-for="a in lists" :b="a"></item> <!-- 注意 a b a :b=a -->
</ul>
</div>
<script>
Vue.component('item',{
props:['b'], /* b b */
template:'<li>{{b.key}}</li>'
});
var app71=new Vue({
el:'.a71',
data:{
lists:[
{key:'adda'},
{key:'bb'},
{key:'cc'}
]
}
});
</script>
vux
vue vue-cli 生成项目
1. npm install -g vue-cli
2. vue init webpack#1.0 myvue // 默认安装 2.0的vue
3. npm install // 安装node_module 可以复制 node_module文件夹放进去就可以了
4. npm install vux // 安装 vux
5. npm install less less-loader --save-dev // 安装 less less-loader
5. npm run dev // 运行 vue-cli 改8080端口位置 config/index.js vux 基于vue 和 WeUI(微信UI) vux demo
https://vux.li vue1.0
http://vuejs.org.cn/guide/ webpack
http://webpack.github.io/ https://github.com/vuejs/vue-loader ES6
http://es6.ruanyifeng.com/ vue-router
https://github.com/vuejs/vue-router 组件换名字
{
components:{
xalert: Alert
}
}
或者全局时
Vue.component('xalert',vuxAlert) vux 兼容 android 4.0+
2016-4-19 微信 android x5 内核 升级到Blink 兼容flex vux 使用 es6 eslint(规范换行、标点符号等)
使用 const let 代替 var
使用 import 组件名 x-input
export 出来的 XInput Radio XTextarea
子组件 flexbox flexbox-item tab tab-item 组件全放在 src/components 入口文件为 index.vue 其他为 tab.vue tab-item.vue
组件属性 规定type 或 validator 进行类型验证 事件命名 on-change 添加on前缀
class 和 style 超过两个属性要写到 computed 里 版本发布见文档P13 ,跳过
playground 见文档 P15 ,跳过 在 webpack.base.conf.js 添加 loader {
test: /vux.src.*?js$/,
loader: 'babel'
}
resolve:{
alias:{
'vux-components':'vux/src/components/' // 路径缩写 webstorm 是否在新窗口中打开
setting-apperance & Behavior -system setting -project opening 第19页
如何阻止vue进行属性代理 object.preventExtensions obj.seal() obj.freeze()
方法 禁止增加属性 禁止删除属性 禁止修改属性
Object.preventExtensions() 是 否 否
Object.seal() 是 是 否
Object.freeze() 是 是 是
以 _ 或 $ 开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性、API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些属性。 所以,使用_或$是一种解决办法。 当然,还有其它的方式,你可以在create钩子中直接声明指定的属性初始化,例如this.xxxx_prop = {},当然,不要让该属性声明在data中,那么此时vue不会去监测xxxx_prop属性的变动。 还有一种办法是使用ES5的Object.preventExtensions来将对象进行密封,或者使用Object.freeze冻结对象,它们都可以达到相同的目的。