vue初学:基础概念

时间:2023-03-09 20:28:50
vue初学:基础概念

一、vue使用步骤:
  1.引包vue.js
  2.html中写要操作的DOM节点
  3.创建vue对象:new Vue({options});
  4.配置options:el:(要操作的对象,用选择器,同jquery),
        emplate:(模板,指定要插入的内容:{{插值表达式}},注:必须只有一个根节点),
        data(function(){return key:emplate中要操作的数据}),
        methods:{函数名:function(){函数体,(this.xxx调用data中定义的数据)(this.xxxMethods调用methods中的方法)}}
        components:{'在emplate中要使用的标签名':要声明的子组件名}

二、vue基础概念:
  1.插值表达式可以是:data中定义的数据;{{ '字符串' }};三元表达式;布尔值;对象{{ {key:value} }}
  2.指令:形如"v-xxx",用于更简便的操作页面和数据。

三、 常用vue指令:
  1.v-text
  2.v-html
  3.v-if
  4.v-else-if
  5.v-else
  6.v-show
  7.v-bind 给属性绑定值,语法:v-bind:属性名="常量||变量名"(常量要写引号),简写 :属性名="常量||变量名"
  8.v-on 绑定事件 语法:v-on:事件名="函数名||表达式",简写 @事件名="函数名||表达式"
  9.v-if和v-show的区别:
    v-if和v-show都是用来控制元素的渲染。v-if判断是否加载,可以减轻服务器的压力,在需要时加载,但有更高的切换开销;v-show调整DOM元素的CSS的dispaly属性,可以使客户端操作更加流畅,但有更高的初始渲染开销。如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
  10.v-bind和v-model区别:
    v-bind可设置所有属性的属性值,但只能单向读取vue中的数据;
    v-model只可设置value属性值,属于双向数据流
  11.v-for 遍历数组或对象,语法:v-for="item in arr/obj"
    扩展知识点:
    数组:v-for="(item,index) in arr"
    对象:v-for="(value,key,index) in obj"

  附demo:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>vue第一个页面</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<style>
.a{
background-color: #ccc;
}
.b{
background-color: pink;
}
</style>
</head>
<body>
<div id="zl"></div> <script type="text/javascript">
new Vue({
el : "#zl",
template : `<div>
<div v-text="myText"></div>
<hr/>
<div v-html="myHtml"></div>
<h4 v-if="isExit">v-if控制是否存在</h4>
<h4 v-show="isShow">v-show控制是否显示</h4>
<!-- 以下三个指令,需结合使用 -->
<button v-if="num == 1" >测试v-if</button>
<button v-else-if="num == 2" >测试v-else-if</button>
<button v-else >测试v-else</button> <input type="text" v-bind:value="myBind" :file=" 'XXX' "></input>
<button v-on:click="myBind='aaa'">用v-on修改vue中数据</button>
<button @click="myBind='bbb'">用v-on简写修改vue中数据</button>
<!-- 双向绑定 -->
<hr/>
<i>当用户输入“同意”时显示按钮:</i>
<input type="text" v-model="myModel"/>
<button type="submit" v-show="myModel=='同意' ">提交</button>
<!-- v-for -->
<hr/>
<ul>
<li v-for="item in stud" :class="item.class">{{item.name}}</li>
</ul>
<!-- methods -->
<button v-on:click="toggleCont">{{name}}</button> <!-- 可缩写为@:click -->
</div>`,
data : function(){
return {
name : "点我!",
myText : "<h1>我是myText的内容</h1>",
myHtml : "<h1>我是myHtml的内容</h1>",
isExit : true,
isShow : true,
num : 4,
myBind : "v-bind测试",
myModel : "v-model测试",
stud : [{name:'张三',class:'a'},{name:'李四',class:'b'},{name:'王五',class:'a'}]
}
},
methods : {
toggleCont : function(){
this.name = "听话"
}
}
}); </script>
</body>
</html>

四、组件化:
  1.局部组件使用步骤:1.创建子---2.声明子---3.使用子
    创建子组件:var 子组件名称(首字母大写)={
            template:'子模板'.....跟new Vue(){}中的内容一样
          }
    父组件components中声明子组件:components:{'在emplate中要使用的标签名':要声明的子组件名}
    父组件template中使用子组件:template:'<标签名></标签名>'
  2.注册全局组件步骤:Vue.component('组件名',{.....})

五、 父组件向子组件传递数据:
  步骤:1.父传数据(属性)---2.声明数据---3.使用数据
    父组件template中,用v-bind将要传递的数据绑定到子组件标签属性中;
    子组件中props:['属性名']声明此数据;
    子组件template中{{属性名}}使用此数据

附demo:(用的Hbuild对es6的支持不是特别好,字符串拼接,忍。。。)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>vue组件练习</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app"></div>
<script type="text/javascript">
//注册全局组件
Vue.component('my-btn',{
template : '<button style="background-color:red;color:#fff;">红色的按钮</button>'
})
//局部子组件
var Mytop = {
data : function(){
return {
myText : '<i>测试v-text</i>',
myHtml : '<i>测试v-html</i>',
myValue : '单/双向数据流...',
stud : {
name : 'jack',
sex : '女',
age : '26'
},
studs : ['张三','李四','王五']
}
},
props : ['myTest'],
template : '<div><h5>我是头部</h5>'+'<p v-text="myText"></p>'+
'<p v-html="myHtml"></p>'+'<p v-if=""></p><hr/>'+
'单向v-bind:<input type="text" :value="myValue"/>'+
'双向v-model:<input type="text" v-model="myValue">'+
'<p>这里输出v-model中双向绑定的数据:{{myValue}}</p><hr/>'+
'v-for循环对象:<ul><li v-for="(val,key,i) in stud">{{key}}:{{val}}:{{i}}</li></ul>'+
'v-for循环数组:<ul><li v-for="item in studs">{{item}}</li></ul><hr/>'+
'<b>接收到父组件的数据为:{{myTest}}</b><hr/>'+
'<my-btn/></div>' }
var Mybody = {
data : function(){
return {
isShow : true,
isExit : true
}
},
template : '<div><p v-show="isShow">我是中部v-show测试</p>'+
'<p v-if="isExit">v-if测试</p>'+
'<button @click="myToggle">点我显示或隐藏</button>'+
'<my-btn/></div>',
methods : {
myToggle : function(){
this.isShow = !this.isShow;
this.isExit = !this.isExit;
}
}
}
//入口组件
var App = {
components : {
'mytop' : Mytop,
'mybody' : Mybody, },
data : function(){
return {
'myTest' : '我是父向子传递的数据'
}
},
template : '<div><h3>我是入口</h3>'+'<mytop :myTest="myTest"></mytop>'+'<mybody/>'+
'<my-btn/></div>',
}
new Vue({
el : "#app",
components : {
'app' : App
},
template : '<app/>'
})
</script>
</body>
</html>

六、 过滤器filter||filters:
  作用:用于A数据到B数据的产出
  局部过滤器filters:
    1.在局部组件中定义filters:{'过滤器名',function(原数据形参,参数1){....return...}}
    2.使用:template中数据输出:{{原数据实参(指明针对谁进行操作) | 过滤器名(实参1)}}
  全局过滤器filter:
    1.Vue.filter('过滤器名',function(参数){...})
    2.使用与局部过滤器相同

附demo:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>过滤器filter || filters</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app"> </div>
<script type="text/javascript">
Vue.filter('myTest',function(data){
return '我是全局过滤器的内容,'+data;
})
var App = {
template :'<div><h5>请输入内容,查看内容是否被反转:</h5>'+
'<input type="text" v-model="myText"/><p>{{myText | reverse("英文版")}}</p><hr/>'+
'<h5>全局过滤器:</h5><p>{{mydata | myTest}}</p></div>',
data : function(){
return {
myText : '',
mydata : '123'
}
},
filters : {
reverse : function(str,lang){
return lang + ":" + str.split('').reverse().join('');
}
}
}
new Vue({
el : "#app",
components : {
'app' : App
},
template : '<app/>'
})
</script>
</body>
</html>

七、watch监视器:
  基本数据类型简单监视,复杂数据类型(obj/arr)深度监视
  用法:watch : {
      要监视的data数据 : function(newV,oldV){...},
      要监视的obj/arr数据 : {
        deep : true,
        handler : function(newV,oldV){...}
      }
    }

附demo:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>监视watch</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app"> </div>
<script type="text/javascript">
var App = {
data : function(){
return {
myText : '111',
stus : [{name : 'jack'}]
}
},
template : '<div><input type="text" v-model="myText" />'+
'<button @click="stus[0].name= \'rose\' ">深度监视stus[0].name</button></div>',
watch : {
myText : function(newV,oldV){
if(newV == 'I love you'){
alert(oldV + ' too');
}
},
stus : {
deep : true,//深度监视
handler : function(newV,oldV){
console.log('监控成功');
}
}
}
}
new Vue({
el : '#app',
components : {
'app' : App
},
template : '<app/>'
})
</script>
</body>
</html>

八、computed群体监视器:
  用法:computed : {
      监视器名称 : function(){//(监视器名称接收此函数return出去的数据)
        return this.xxx;//(this.xxx为本组件中data定义的数据)
      }
    }

附demo:

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>computed群体监视</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app"> </div>
<script type="text/javascript">
var App = {
data : function(){
return {
value01 : 0,
value02 : 0,
rate : 0
}
},
template : '<div><p>计算(a+b)*c的值:</p>a:<input type="text" v-model="value01"/>'+
'b:<input type="text" v-model="value02"/><br/>c:<input type="text" v-model="rate"/>'+
'<p>{{result}}</p></div>',
computed : {
result : function(){
return (parseFloat(this.value01)+parseFloat(this.value02))*parseFloat(this.rate);
}
}
}
new Vue({
el : '#app',
components : {
'app' : App
},
template : '<app/>' })
</script>
</body>
</html>

九、 watch和v-model的区别
  v-model : 只用于对数据的双向绑定及展示。是对单个数据的监视
  watch : 可用于对数据的双向绑定、展示,以及一些复杂的行为。也是对单个数据的监视
  computed : 用于群体监视

十、内置组件slot:

  父组件传递的DOM结构

附demo:

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>slot内置组件</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
li {
list-style: none;
float: left;
width: 33%;
height: 50px;
background-color: aqua;
border: 1px solid black;
}
</style>
</head>
<body>
<div id="app"></div>
<script type="text/javascript">
Vue.component('myLi',{
template : '<li><slot></slot></li>'
})
var App = {
template : '<div><ul><myLi><h4>111</h4></myLi>'+
'<myLi><button>222</button><b>222</b></myLi>'+
'<myLi><input type="text" value="333"/></myLi>'+
'<myLi>444</myLi><myLi>555</myLi><myLi>666</myLi>'+
'<myLi>777</myLi><myLi>888</myLi><myLi>999</myLi></ul></div>'
}
new Vue({
el : '#app',
components : {
'app' : App
},
template : '<app/>'
})
</script>
</body>
</html>

十一、组件生命周期:
  beforeCreate : 组件创建之前(不可获取到组件中的数据)
  created : 组件创建之后
  beforeMount : vue启动前的DOM
  mounted : vue启动后的DOM
  //beforeUpdate/updated在DOM发生更新时才会被触发
  beforeUpdate : 更新前DOM
  updated : 更新后DOM
  beforeDestory : 本组件销毁之前
  destroyed : 本组件销毁之后
  //对于组件的频繁创建和销毁是不对的,内置组件<keep-alive></keep-alive>包裹后的v-if表示激活或停用该组件
  alivated : 组件被激活
  dealivated : 组件被停用
附demo:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>组件生命周期</title>
<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
<script src="js/组件生命周期.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app"> </div>
</body>
</html>
 window.onload = function(){
var MyTest = {
data : function(){
return {
myText : '111'
}
},
template : '<h3>{{myText}}</h3>'
}
var App = {
data : function(){
return {
myText : 'aaa',
isExit : true
}
},
components : {
'myTest' : MyTest
},
template : '<div><h5>{{myText}}</h5><button @click="myText+=1 ">更改DOM数据</button>'+
'<hr/><myTest v-if="isExit"></myTest><button @click="isExit = !isExit">创建及销毁MyTest子组件</button></div>',
beforeCreate : function(){
//组件创建之前
console.log(this.myText);
},
created : function(){
//组件创建之后
console.log(this.myText);
},
beforeMount : function(){
//vue启动前的DOM
console.log(document.body.innerHTML);
},
mounted : function(){
//vue启动后的DOM
console.log(document.body.innerHTML);
},
//beforeUpdate/updated在DOM发生更新时才会被触发
beforeUpdate : function(){
//更新前DOM
console.log(document.body.innerHTML);
},
updated : function(){
//更新后DOM
console.log(document.body.innerHTML);
}
}
new Vue({
el : '#app',
components : {
'app' : App
},
template : '<app/>'
})
}