VUE学习笔记

大致介绍

VUE 是MVVM框架,由事件、数据驱动视图

主要特点如下:

*简单:中文文档、对优秀框架的简化

*更小:

*更快:运用虚拟DOM技术,与JQuery操作DOM相比更快

*响应式:

*组件核心:一个页面由多个组件构成

 

缺点:整个项目打包,造成搜索引擎识别困难

 

Vue指令:vue隔离对DOM的操作,当需要操作DOM时,需要借助内置指令和自定义指令完成。

 

具体内容:

$     VUE实例对象,如: $.data(参数data的实例)          $.el(相当于对应的实例对象)                 

 

v-html    输出文本是若文本中有html标签将会输出对应的标签

 

过滤器:用作常见文本格式化

 

v-if、v-else、v-else-if  条件语句

 

v-show :在data中定义ok为true或false决定当前标签是否显示

<h1 v-show="ok">Hello!</h1>

 

v-for:循环语句:

<div id="app">
  <ol>
    <li v-for="arr in arrs">
      {{ arr.name }}
    </li>
  </ol>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    arrs: [
      { name: 'value1' },
      { name: 'value2' },
      { name: 'value3' }
    ]
  }
})
</script>

 

计算属性: computed    用于处理复杂的逻辑

可以使用 methods 来替代 computed,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,每当页面重新渲染时,函数便会重新执行。

<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'comutedTest!'
  },
  computed: {
    //getter
    reversedMessage: function () {
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

watch: 属性监听,用来相应数据的变化

<div id = "computed_props">
    千米 : <input type = "text" v-model = "kilometers">
    米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>
<script type = "text/javascript">
    var vm = new Vue({
    el: '#computed_props',
    data: {
        kilometers : 0,
        meters:0
    },
    watch : {
        //当kilometers发生变化,换算两个输入框,更新
        kilometers:function(val) {
            this.kilometers = val;
            this.meters = this.kilometers * 1000
        },
        meters : function (val) {
            this.kilometers = val/ 1000;
            this.meters = val;
        }
    }
    });
})
</script>

 

v-bind绑定样式:

<div class="static"
     v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>
//其中active和text-danger是style样式类
//布尔值isActive和hasError决定这两个样式是否被引用

样式内联:

<div id="app">
    <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">VUE 学习</div>
</div>

 

v-model:数据双向绑定

个人关于v-model的理解:重点还是 “绑定” 不论与data中的属性值绑定的是单个的文本框,还是分组了的复选框,一旦进行绑定,代表了两者指向了相同的引用,可以理解成java的浅拷贝。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TEST VUE</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app1">
  <p>input 元素:</p>
  <input v-model="message">
  <p>消息是: {{ message }}</p>
	
  <p>textarea 元素:</p>
  <p style="white-space: pre">{{ message2 }}</p>
  <textarea v-model="message2"></textarea>
</div>

<script>
new Vue({
  el: '#app1',
  data: {
    message: 'messageOfInput',
	message2: 'messageOfTextArea'
  }
})
</script>

<!--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-->
<div id="app2">
  <p>单个复选框:</p>
  <input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>
	
  <p>多个复选框:</p>
  <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
  <label for="runoob">Runoob</label>
  <input type="checkbox" id="google" value="Google" v-model="checkedNames">
  <label for="google">Google</label>
  <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
  <label for="taobao">taobao</label>
  <br>
  <span>选择的值为: {{ checkedNames }}</span>
</div>

<script>
new Vue({
  el: '#app2',
  data: {
	checked : false,
    checkedNames: []
  }
})
</script>


</body>
</html>

 

VUE.js组件

<div id="test">
    <tests></tests>
</div>
<script>
    Vue.component('tests',{
        template: "<div style='height:100px;width:200px;background-color:red;'></div>"
    });
    var vm = new Vue({
        el: "#test"
    });
</script>

上面的代码中定义了一个全局组件,"tests"  个人理解成把一片的变迁代码封装了,这样可以让代码复用率更高。效果如下:

局部组件:

注意:组件名不能带有大写字母(反正我这一开始把组件名写成了tempTest是显示不了,全改为小写了才能显示的)

<div id="test2">
    
    //本局部组件只能在父模板可用
    <temptest></temptest>

</div>

<script>
var child = {
        template: "<h1>HELLO WORLD!</h1>"
    }
var VM = new Vue({
    el:"#test2",
    components:{
        'temptest': child
    }
})
</script>

效果如下:

 

动态Prop:父组件通过prop传递属性

个人的理解是:prop为父组件data中的参数设置了别名message;父组件中定义了一个全局组件child,在定义的全局组件中通过该别名绑定数据;在子组件中通过别名可以引用父组件中的参数。(可能理解有错,欢迎大佬批评)

<!DOCTYPE html>
<html>
    <head>
        <title>TEST VUE</title>
        <meta charset="UTF-8">
        <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
    </head>
    <body>
        <div id="test1">
            <input v-model="parentData"><br>
            <child v-bind:message="parentData"></child>
        </div>
        <script>
            Vue.component('child',{
                props: ['message'],
                template: "<h1>{{message}}</h1>"
            });
            var vm = new Vue({
                el: "#test1",
                data:{
                    parentData: "test Parent DATA!"
                }
            })
        </script>
        
        <!--实例2-->
        
        <div id="test1">
            <arrs v-for="item in arr" v-bind:array="item"></arrs>
        </div>
        <script>
            Vue.component('arrs',{
                props: ['array'],
                template: "<h2>{{array.name}}</h2>"
            });
            var vm = new Vue({
                el: "#test1",
                data:{
                    arr: [
                        {name: "bokerr"},
                        {name: "jira"},
                        {name: "jane"},
                        {name: "tom"},
                        {name: "jackson"},
                        {name: "tomcat"}
                    ]
                }
            })
        </script>


    </body>
</html>

自定义事件:props让父组件可以向子组件传递参数,而子组件向父组件传递信息则需要自定义事件;

个人理解:<my-comp></my-comp>是一个全局组件,在定义全局组件时通过 "emit" 定义了一个 "keywords"关键字,父组件中的方法TotalMethod通过v-on与该关键字绑定,那么当子组件发生变化时将 触发/驱动 该父组件方法"TotalMethod"。

而此处需要注意的是,data是一个方法,类似直接返回了一个counter实例,如果data是一个对象,那么结果是所有的组件实例公用一个参数。

this.$emit('keywords');<!--触发绑定在keywords关键字上的事件-->
this.$on('keywords');<!--监听绑定在keywords关键字上的事件-->
<div id="test1">
        <h1>{{total}}</h1>
        <my-comp v-on:keywords="TotalMethod"></my-comp>
        <my-comp @keywords="TotalMethod"></my-comp>
    </div>
    <script>
        Vue.component('my-comp',{
            template: '<button @click="testMethod">{{counter}}</button>',
                data: function(){
                    return {
                        counter: 0
                    }
                },
            methods: {
                testMethod: function(){
                    this.counter += 1;
                    this.$emit('keywords');
                }
            }
        });
        var VM = new Vue({
            el: "#test1",
            data: {
                total: 0
            },
            methods:{
                TotalMethod: function(){
                    this.total += 1;
                }
            }
        })
    </script>

自定义指令:感觉没啥好说的,都是大部分都是关键字

局部指令

<script>
 var vm = new Vue({
            el: "#app",
            directives: {
                focus:{
                    inserted: function(el){
                        el.focus();
                    }
                }
            }
        });
</script>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值