vue1.0学习

vue

一片html代码配合上json,new出来vue实例

Demo:1

数据双向绑定(v-model="message",{{message}})

<div id="box">
  <input type='text' v-model="message">
  <p>{{message}}</p>
</div>

var c=new Vue({

  el:'#box',    //el为挂载点,可以是class,id,元素

  data:{

    message:'hello world!'

  }

})

Demo:2

v-for

循环数组

<div id="box">

<ul>

<li v-for="arr in arrs">

{{arr}}  {{$index}}

</li>

</ul>

</div>

var c=new Vue({

el:'#box',//class,id,元素度可以

data:{

arrs:['apple','banana','orange','pear'],

jsons:{a:'apple',b:'banner',c:'car'}

}

})

循环对象

1:

<div id="box">

<ul>

<li v-for="json in jsons">

{{json}}  {{$index}} {{$key}}

</li>

</ul>

</div>

2:

<div id="box">

<ul>

<li v-for="(k,v) in jsons">

{{k}}  {{v}} {{$index}}

</li>

</ul>

</div>

结果

Demo3:

v-on:(跟事件)click

methods 绑定事件方法

<div id="box">
  <input type="button" value="按钮" v-on:click="add()">
  <br/>
  <ul>
    <li v-for="arr in arrs">
      {{arr}} {{$index}}
    </li>
    <li v-for="json in jsons">
      {{json}} {{$index}} {{$key}}
    </li>
  </ul>
</div>

var c=new Vue({
  el:'#box',//class,id,元素度可以
  data:{
    arrs:['apple','banana','orange','pear'],
    jsons:{a:'apple',b:'banner',c:'car'}
  },
  methods:{
    add:function(){
    this.arrs.push('tomato');
    }
  }
})

 Demo4

v-show  true/false

<div id="box">
  <input type="button" value="按钮" v-on:click="a=false">
  <div style="100px;height:100px ;background:red" v-show="a">
  </div>
</div>

var c=new Vue({
  el:'#box',//class,id,元素度可以
  data:{
    a:true
  }
})

v-show来控制显示隐藏

Demo5

 简易留言板编写

<div class="container" id="box">
<form role="form">
<div class="form-group">
<label>用户名:</label>
<input type="text" id="username" class="form-control" placeholder="输入用户名" v-model="username">
</div>
<div class="form-group">
<label>年龄:</label>
<input type="text" id="username" class="form-control" placeholder="输入年龄" v-model="age">
</div>
<div class="form-group">
<input type="button" value="添加" class="btn btn-primary" v-on:click="add()">
<input type="reset" value="重置" class="btn btn-danger">
</div>
</form>
<hr/>
<table class="table">
<caption class="h2 text-info">用户信息表</caption>
<tr class="text-danger">
<th class="text-center">序号</th>
<th class="text-center">名字</th>
<th class="text-center">年龄</th>
<th class="text-center">操作</th>
</tr>
<tr class="text-center" v-for="item in myData">
<td>{{$index+1}}</td>
<td>{{item.name}}</td>
<td>{{item.age}}</td>
<td>
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#layer" v-on:click="nowIndex=$index">删除</button>
</td>
</tr>

<tr v-show="myData.length!=0">
<td colspan="4" class="text-right">
<button class="btn btn-danger btn-sm" data-toggle="modal" data-target="#layer" v-on:click="nowIndex=-2">删除全部</button>
</td>
</tr>
<tr v-show="myData.length==0">
<td colspan="4" class="text-center text-muted">
<p>暂无数据....</p>
</td>
</tr>
</table>
<!--弹出框-->
<div role="dialog" class="modal" id="layer" data-index="{{nowIndex}}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span>&times;</span>
</button>
<h4 class="modal-title">确认删除么?</h4>
</div>
<div class="modal-body text-right">
<button data-dismiss="modal" class="btn btn-primary btn-sm">取消</button>
<button data-dismiss="modal" class="btn btn-danger btn-sm" v-on:click="deleteMsg(nowIndex)">确认</button>
</div>
</div>
</div>
</div>
</div>

vue

var c=new Vue({
el:'#box',
data:{
myData:[],
username:'',
age:'',
nowIndex:-100
},
methods:{
add:function(){
this.myData.push({
name:this.username,
age:this.age
});
this.username='';
this.age='';
},
deleteMsg:function(n){
if(n==-2){
this.myData=[];
}
this.myData.splice(n,1);
}
}
})

、******************************************************************************

列:颜色切换

<style>.red{color:'red'}  .blue:{color:'blue'}</style>

<strong :class="{red:a,blue:b}"  @click="changeColor"></strong>

new Vue({

  el:'#app",

  data:{

    a:true,

    b:false

  },

  methods:{

    changeColor:function(){

      this.a=!this.a,

      this.b=!this.b

    }

  }

})

列jsonp传递

<div id="box">
<input type="text" v-model="t1" @keyup="get()">
<ul>
<li v-for="value in myData">
{{value}}
</li>
</ul>
<p v-show="myData.length==0">暂无数据...</p>
</div>

new Vue({
  el:'body',
  data:{
    myData:[],
    t1:''
  },
  methods:{
    get:function(){
      this.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',

      {
        wd:this.t1
      },{
        jsonp:'cb'
    }).then(function(res){
      this.myData=res.data.s;
     },function(){

    });
  }
  }
});

、***************************************************************************

二事件深入

v-on:click   简写 @click

事件对象:

@click="show($event)"

阻止冒泡

ev.cancleBubble=true

@click.stop 

阻止默认事件

.prevent

常用回车键

@keyup.enter
上下左右
@keyup/keydown.left

三属性

v-bind:src=""

v-bind:src 简写:src 

<div id="box">
<img v-bind:src="url" alt="">
</div>

var c=new Vue({
  el:'#box',
  data:{
    url:'https://www.baidu.com/img/bd_logo1.png',

  }
});

1、:class="[red]"

2、:class="{red:true}"

3、:class="json"  

 data:{

  json:{red:a,blue:false}

}

style

:style="[c]"

模板

{{msg}}   数据更新模板化

{{msg}}  数据更新模板变化

{{*msg}}  数据只绑定一次

{{{msg}}} html任意输出

过滤器

{{msg|filterA}}

{{msg|filterA|filterB}}

uppercase

lowercase

capitalize

{{12 | curreny}} $12

{{12 | curreny '¥'}} $12

第二个参数是修改

  四交互 v-resource

get

请求文本

new Vue({

  el:'#box',

  data:{},

  methods:{

    get:function(){

      this.$http.get('a.txt').then(function(res){

        alert(res.data);

      },function(res){

        alert(res.status);

      });

    }

  }

})

给服务器发送请求

new Vue({

  el:'#box',

  data:{},

  methods:{

    get:function(){

      this.$http.get('get.php',{

        a:1,

        b:20

      }).then(function(res){

        alert(res.data);

      },function(res){

        alert(res.status);

      });

    }

  }

})

post

var c=new Vue({
el:'#box',
data:{

},
methods:{
  get:function(){
    this.$http.post('post.php',{
    a:1,
    b:20
  },{
    emulateJSON:true //这个相当于post的头文件
  }).then(function(res){
    alert(res.data);
  },function(res){
    alert(res.status)
  });
  }
}
});

jsonp

先获取接口

https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word&word=a

https://sug.so.360.cn/suggest?callback=suggest_so&word=a

var c=new Vue({
el:'#box',
data:{

},
methods:{
get:function(){
this.$http.jsonp('https://sug.so.360.cn/suggest',{
wd:'a'
},{
jsonp:'cb'
//这个相当于post的头文件
}).then(function(res){
alert(res.data);
},function(res){
alert(res.status)
});
}
}
});

 微博搭建

vue生存周期

v-cloak防止闪烁

<style>
[v-cloak]{
  display:none;
}
</style>

<span>{{msg}}</span>

<span v-text="msg"></span>

<span>{{{}msg}}}</span>

<span v-html="msg"></span>

上面两种结果一样的,就是效果上后面这种自带闪烁

  钩子函数

  created  -> 实例已经创建

  beforeCompile ->编译之前

  compiled ->编译之后

  ready -> 加载完成 插入到文档中

beforeDestroy ->销毁之前

destroyed ->销毁之后

var vm=new Vue({
  el:'#box',
  data:{
    a:1
  },
  computed:{
    b:{
      get:function(){//默认写法
        return this.a+2;
      },
      set:function(val){//当赋值是
        this.a=val;
         }
    }
  }
});

vm.$el ->就是元素el

vm.$data ->就是data

vm.$mount('#box') //手动挂载

vm.$options  ->获取自定义属性

vm.$detroy ->销毁对象

遇到循环的数据,你想要展示,最好在html中加入

track-by="$index"

var vm=new Vue({

  aa:11,  //自定义属性

  data:{

    a:1

  }

}).$mount('#box');

vm.$options.aa   //就可以访问了

过滤器

| debounce 2000  延迟

数据配合使用过滤器

limitBy 参数(取几个) 从哪开始

filterBy 过滤

orderBy 排序

自定义过滤器

Vue.filter(name,function(){

  alert();

})

<div id="box">
  {{a|toDou}}
</div>

Vue.filter('toDou',function(input){
  return input<10?'0'+input:''+input;
})
var vm=new Vue({
  el:'#box',
  data:{
    a:9
  }
});

过滤html标记

自定义指令

Vue.directive(指令名称,function(){

  

})

指令名称 v-red 只能写red

指令必须以v-开头

自定义元素指令

Vue.elementDirective('zns-red',{
  bind:function(){
    this.el.style.background='red';
  }
});

<zns-red></zn-sred>

 监听数据变化

vm.$watch()

vm.$watch('a',function(){
  alert('发生变化');
});

五、bower包管理器

在指定文件打开cmd

npm install bower -g 

bower install vue

他会给你安装最新的,如果不想要可以删除bower uninstall vue

 bower install vue#版本号(1.0.28)

 bower info vue 可以查看版本信息

 vue 过渡(动画)

本质走的css3:transition,animation

<div id="div1" v-show="bSign" transition="fade"></div>

动画:
.fade-transition{

}
进入:
.fade-enter{
opacity: 0;
}
离开:
.fade-leave{
opacity: 0;
transform: translateX(200px);
}

列:

<div id="box">
<input type="button" value="按钮" @click="toggle">
<div id="div1" class="animated" v-show="bSign" transition="bounce"></div>
</div>

var c=new Vue({
el:'#box',
data:{
bSign:true
},
methods:{
toggle:function(){
this.bSign=!this.bSign;
}
},
transitions:{//定义动画
bounce:{
enterClass:'zoomInLeft',
leaveClass:'zoomOutRight'
}
}
})

组件

组件: 一个大对象
定义一个组件:
1. 全局组件
var Aaa=Vue.extend({
template:'<h3>我是标题3</h3>'
});

Vue.component('aaa',Aaa);

*组件里面放数据:
data必须是函数的形式,函数必须返回一个对象(json)

2,局部组件

2. 局部组件
放到某个组件内部

var Aaa=Vue.extend({
  template:'<h3>{{msg}}</h3>'
  data:function(){
    return {
      msg:'我是标题'
    }
  },
});


var vm=new Vue({
  el:'#box',
  data:{
    bSign:true
  },
  components:{ //局部组件
    aaa:Aaa
  }
});

另一种编写方式:
Vue.component('my-aaa',{
template:'<strong>好</strong>'
});

var vm=new Vue({
  el:'#box',
  components:{
    'my-aaa':{

      data:function(){

        return{

          msg:'2222'

        }

      },

      methods:{

      },
      template:'<h2>{{msg}}</h2>'
    }
  }
});

配合模板:
1. template:'<h2 @click="change">标题2->{{msg}}</h2>'

2. 单独放到某个地方
a). <script type="x-template" id="aaa">
<h2 @click="change">标题2->{{msg}}</h2>
</script>
b). <template id="aaa">
<h1>标题1</h1>
<ul>
<li v-for="val in arr">
{{val}}
</li>
</ul>
</template>

多个组件切换 动态组件

<div id="box">
<input type="button" @click="a='aaa'" value="aaa组件">
<input type="button" @click="a='bbb'" value="bbb组件">
<component :is="a"></component>
</div>

var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'<h2>我是aaa组件</h2>'
},
'bbb':{
template:'<h2>我是bbb组件</h2>'
}
}
});

vue-devtools   ->调试工具

组件数据传递: √
1. 子组件就想获取父组件data
在调用子组件:
<bbb :m="数据"></bbb>

子组件之内:
props:['m','myMsg']

props:{
'm':String,
'myMsg':Number
}

2. 父级获取子级数据
*子组件把自己的数据,发送到父级

vm.$emit(事件名,数据);

v-on: @

 slot位置、槽口

 重点

vue->SPA应用,单页面应用

v-resource  交互

v-router     路由  0.7.13

主页 home

新闻页 news

html:
<a v-link="{path:'/home'}">主页</a> 跳转链接

展示内容:
<router-view></router-view>

<div id="box">
<ul>
<li>
<a v-link="{path:'/home'}">主页</a>
</li>
<li>
<a v-link="{path:'/news'}">新闻</a>
</li>
</ul>
<div>
<router-view></router-view>
</div>
</div>

<script>
//1,准备根组件
var App=Vue.extend();

//2准备Home和Neews组件
var Home=Vue.extend({
template:'<h3>我是Home</h3>'
})

var News=Vue.extend({
template:'<h3>我是News</h3>'
})

//3.准备路由
var router=new VueRouter();

//4.关联
router.map({
'home':{
component:Home
},
'news':{
component:News
}
})
//5启动路由
router.start(App,'#box');
//6跳转
router.redirect({
'/':'/home'
})
</script>

路由嵌套

<template id="home">
<h3>我是主页</h3>
<div>
<a v-link="{path:'/home/login'}">登录</a>
<a v-link="{path:'/home/reg'}">注册</a>
</div>
<div>
<router-view></router-view>
</div>
</template>

router.map({
'home':{
  component:Home,
  subRoutes:{
    'login':{
      component:{
        template:'<strong>我是登录</strong>'
      }
    },
    'reg':{
      component:{
        template:'<strong>我是注册</strong>'
      }
    }
  }
},
'news':{
  component:News
}
})

路由的其他信息

/detail/:id/age/:age

{{$route.params | json}} -> 当前参数

{{$route.path}} -> 当前路径

{{$route.query | json}} -> 数据

六 vue-loader

其他loader ->  css-loader、url-loader、html-loader.....

nodejs ->require exports

broserify 模块加载,只能加载js

webpack 模块加载器,一切东西都是模块

require('style.css'); ->   css-loader、style-loader

vue-loader基于webpack

.vue文件放置

放置的是vue组件代码

<template>

html

</template>

<style>

</style>

<script>

js

</script>

简单目录

index.html

main.js  入口文件

App.vue  vue文件

package.json  工程文件(项目依赖、名称、配置)

  npm init --yes 生成

webpack.config.js  webpack的配置文件

ES6: 模块化开发
导出模块:
export default {}
引入模块:
import 模块名 from 地址

webpak准备工作:
cnpm install webpack --save-dev
cnpm install webpack-dev-server --save-dev

App.vue -> 变成正常代码 vue-loader@8.5.4
cnpm install vue-loader@8.5.4 --save-dev

cnpm install vue-html-loader --save-dev

vue-html-loader、css-loader、vue-style-loader、
vue-hot-reload-api@1.3.2

babel-loader
babel-core
babel-plugin-transform-runtime
babel-preset-es2015
babel-runtime

路由:
vue-router

-> 如何查看版本:
bower info vue-router

路由使用版本: 0.7.13
配合vue-loader使用:
1. 下载vue-router模块
cnpm install vue-router@0.7.13
2. import VueRouter from 'vue-router'

3. Vue.use(VueRouter); //

4. 配置路由
var router=new VueRouter();
router.map({
路由规则
})
5. 开启
router.start(App,'#app');

注意:
之前: index.html -> <app></app>
现在: index.html -> <div id="app"></div>

App.vue -> 需要一个 <div id="app"></div> 根元素

home news
---------------------------------------------
路由嵌套:
和之前一模一样
--------------------------------------------
上线:
npm run build
-> webpack -p
--------------------------------------------
脚手架:
vue-cli——vue脚手架
帮你提供好基本项目结构

本身集成很多项目模板:
simple 个人觉得一点用都没有
webpack 可以使用(大型项目)
Eslint 检查代码规范,
单元测试
webpack-simple 个人推荐使用, 没有代码检查 √

browserify -> 自己看
browserify-simple

--------------------------------------------
基本使用流程:
1. npm install vue-cli -g 安装 vue命令环境
验证安装ok?
vue --version
2. 生成项目模板
vue init <模板名> 本地文件夹名称
3. 进入到生成目录里面
cd xxx
npm install
4. npm run dev

日常所遇,随手而记。
原文地址:https://www.cnblogs.com/zhihou/p/7142470.html