zoukankan      html  css  js  c++  java
  • Vue.js学习笔记

    Vue.js 模板语法

    1. 文本:{{}}

    数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值。

    div id="app">
      <p>{{ message }}</p>
    </div>
    

    关键代码:文本 {{}}

    2. html: v-html

    使用 v-html 指令用于输出 html 代码。

    html :

    <div id="app">
        <p v-html="message"></p>
    </div>
    

    javascript :

        new Vue({
            el: '#app',
            data: {
                message: '<h1>hello,vue.js!</h1>'
            }
        })  
    

    关键代码: v-html 以及 {{}}

    3. 属性: v-bind

    HTML 属性中的值应使用 v-bind 指令。

    html :

    <div id="app2">
        <label for="r1">修改颜色</label><input type="checkbox" v-model="class1"  id="r1" />
        <br />
        <div v-bind:class="{'class1': class1}">
            【验证v-bind的用法】这里和class1 的属性进行了绑定。会随着class1的改变而改变。
        </div>
    </div>
    

    css :

    <style type="text/css">
        .class1{
            background: #440;
            color: #ee0;
        }
    </style>
    

    javascript :

    new Vue({
        el:'#app2',
        data: { class1: false }
    });
    

    4. 表达式

    Vue.js 都提供了完全的 JavaScript 表达式支持。

    html :

    <div id="app3">
        {{5+5}}<br />
        {{ok ? 'YES' : 'NO'}} <br />
        {{ message.split('').reverse().join('')}} <br />
        <div v-bind:id="'list-' + id">叶莜落</div>
    </div>
    

    javascript :

    new Vue({
        el:'#app3',
        data: {
            ok: true,
            message: 'ye you luo',
            id: 1
        }
    });
    

    5. 指令

    指令是带有 v- 前缀的特殊属性。
    指令用于在表达式的值改变时,将某些行为应用到 DOM 上。

    html :

    <div id="app4">
        <p v-if="seen">现在你看到我了</p>
    </div>
    

    javascript :

    new Vue({
        el: '#app4',
        data: {
            seen: true
        }
    });
    

    在上面的示例中,如果在JavaScript中将seen的值置为 false,则该DOM不会在浏览器中加载。

    6.参数

    参数在指令后以冒号指明。
    例如, v-bind 指令被用来响应地更新 HTML 属性。
    v-on 指令用于监听 DOM 事件。

    html :

    <div id="app5">
        <p><a v-bind:href="url">博客园</a></p>
        <p v-on:click="dosomething">绑定了点击事件</p>
    </div>
    

    javascript :

    new Vue({
        el: '#app5',
        data: {
            url: 'http://www.cnblogs.com/helloIT'
        },
        methods:{
            dosomething: function(){
                alert('hello,Vue.js!')
            }
        }
    });
    

    7.修饰符

    8.用户输入: v-model

    在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
    html :

    <div id="app6">
        <p>输入的字符串: {{message6}}</p>
        <input v-model="message6" />
    </div>
    
    <div id="app7">
        <p>{{message7}}</p>
        <button v-on:click="reverseMessage">{{message7_1}}</button>
    </div>
    

    javascript :

    new Vue({
        el: "#	app6",
        data: {
            message6: '叶莜落'
        }
    });
    
    new Vue({
        el: "#app7",
        data: {
            message7: '叶莜落',
            message7_1: '点击翻转'
        },
        methods: {
            reverseMessage:function(){
                this.message7 = this.message7.split('').reverse().join('')
            }
        }
    });
    

    9.过滤器

    Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:

    <!-- 在两个大括号中 -->
    {{ message | capitalize }}
    <!-- 在 v-bind 指令中 -->
    <div v-bind:id="rawId | formatId"></div>
    

    html :

    <div id="app8">
    	使用过滤器让首字母大写: {{message8 | capitalize}}
    </div>
    

    javascript :

    new Vue({
        el: '#app8',
        data: {
            message8: 'yeyouluo',
        },
        filters: {
            capitalize: function(value){
                if( !value ) {
                    return '';
                }
                vlue = value.toString();
                return value.charAt(0).toUpperCase() + value.slice(1);
            }
        }
    });
    

    注意:
    ①过滤器可以像管道一样串联。
    ②过滤器是JavaScript函数,因此可以接受参数。
    {{ message | filterA('arg1', arg2) }
    这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

    10.缩写

    Vue.js为两个最常用的指令提供了特别的缩写:

    10.1 v-bind

    <!-- 完整语法 -->
    <a v-bind:href="url"></a>
    <!-- 缩写 -->
    <a :href="url"></a>
    

    10.2 v-on

    <!-- 完整语法 -->
    <a v-on:click="doSomething"></a>
    <!-- 缩写 -->
    <a @click="doSomething"></a>
    

    Vue.js 条件语句

    1.v-if

    使用场景:
    ①html元素
    ②template
    注:还可以使用在字符串模板引擎中,如Handlebars。

    html :

    <div id="app1">
        <p v-if="seen">现在你看到我了</p>
        <template v-if="ok">
            <h1>叶莜落</h1>
            <p>技术改变世界</p>
            <p>梦想引领技术</p>
        </template>
    </div>
    

    javascript :

    <script>
        new Vue({
            el: '#app1',
            data: {
                seen:true,
                ok:true
            }
        })
    </script>
    

    2.v-else

    html :

    <div id="app1">
        <p v-if="seen">现在你看到我了</p>
        <div v-else>seen对应的内容没有显示</div>
        <p v-if="seen">哈哈哈</p>
    
        <template v-if="ok">
            <h1>叶莜落</h1>
            <p>技术改变世界</p>
            <p>梦想引领技术</p>
        </template>
        <template v-else>模板中的内容没有显示</template>
        <p v-if="seen">嘻嘻嘻</p>
    </div>
    

    javascript :

    <script>
        new Vue({
            el: '#app1',
            data: {
                seen:false,
                ok:false
            }
        })
    </script>
    

    结果:
    seen对应的内容没有显示
    模板中的内容没有显示

    总结:
    ①对块状元素而言,v-else对应else块。只要v-if对应的值相同,则无论多个v-if如何分散,都对应一个v-else。
    ②对template而言,v-else只能放在template中。

    3.v-else-if

    html :

    <div id="app2">
        <div v-if="type === 'A'">A</div>
        <div v-else-if="type === 'B'">B</div>
        <div v-else-if="type === 'C'">C</div>
        <div v-else>Not A/B/C</div>
    </div>
    

    javascript :

    new Vue({
        el: '#app2',
        data: {
            type: 'D'
        }
    })
    

    总结:v-else 、v-else-if 必须跟在 v-if 或者 v-else-if之后。

    4.v-show

    可以使用 v-show 指令来根据条件展示元素,达到v-if的效果。

    html :

    <div id="app3">
        <h1 v-show="ok2">Hello!</h1>
    </div>
    

    javascript :

    new Vue({
        el: "#app3",
        data: {
            ok2: true
        }
    })
    

    Vue.js 循环语句

    循环语句使用v-for。
    使用场景:
    ①html列表元素
    ②模板

    1.单纯的html列表元素示例
    html :

    <div id="app1">
        <ol>
            <li v-for="site in sites">{{site.name}}</li>
            <li>---------</li>
        </ol>
    </div>
    

    javascript :

    new Vue({
        el:'#app1',
        data: {
            sites: [
                {name:'yeyouluo1'},
                {name:'yeyouluo2'},
                {name:'yeyouluo3'}
            ]
        }
    })
    

    结果:
    ![](file:///D:/data/vuejs/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/imgs/v-for-result-1.png)

    2.模板示例
    html :

    <div id="app2">
        <ul>
            <template v-for="book in books">
                <li>{{book.name}}</li>
                <li>--------</li>
            </template>
        </ul>
    </div>
    

    javascript :

    new Vue({
        el:'#app2',
        data: {
            books:[
                {name: '《飘》'},
                {name: '《悲惨世界》'},
                {name: '《呐喊》'}
            ]
        }
    })
    

    结果:
    ![](file:///D:/data/vuejs/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/imgs/v-for-result-2.png)

    3.v-for迭代对象

    v-for 可以通过一个对象的属性来迭代数据。

    3.1 迭代对象默认第一个参数为value
    html :

    <div id="app3">
        <ul>
            <li v-for="o in object">{{o}}</li>
        </ul>
    </div>
    

    javascript :

    new Vue({
        el:'#app3',
        data: {
            object: {
                name: '百度',
                url: 'https://www.baidu.com',
                slogan:'百度一下,你就知道'
            }
        }
    })
    

    结果 :
    ![](file:///D:/data/vuejs/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/imgs/v-for-result-3.png)

    思考:如何实现一个对象数组的迭代?

    3.2 迭代对象默认第二个参数为key,默认第三个参数为index
    html :

    <div id="app3">
        <ul>
            <li v-for="o in object">{{o}}</li>
        </ul>
        <ul>
            <li v-for="(value,key) in object">{{key}} : {{value}}</li>
        </ul>
        <ul>
            <li v-for="(value,key,index) in object">{{index}} . {{key}} : {{value}}</li>
        </ul>
    </div>
    

    javascript :

    new Vue({
        el:'#app3',
        data: {
            object: {
                name: '百度',
                url: 'https://www.baidu.com',
                slogan:'百度一下,你就知道'
            }
        }
    })
    

    结果:
    ![](file:///D:/data/vuejs/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/imgs/v-for-result-4.png)

    4.v-for 迭代整数
    html :

    <div id="app4">
        <ul>
            <li v-for="n in 10">{{ n }}</li>
        </ul>
    </div>
    

    javascript :

    new Vue({
        el:'#app4'
    })
    

    结果:
    ![](file:///D:/data/vuejs/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/imgs/v-for-result-5.png)

    Vue.js 计算属性

    Vue.js 计算属性是在Vue()构造函数中使用computed属性。

    html :

    <div id="app1">
        <p>原始字符串:{{ message }}</p>
        <p>计算后反转字符串:{{ reversedMessage }}</p>
    </div>
    

    javascript :

    <script type="text/javascript">
        var vm = new Vue({
            el: '#app1',
            data: {
                message: 'yeyouluo!'
            },
            computed: {
                reversedMessage:function(){
                     // `this` 指向 vm 实例
                    return this.message.split('').reverse().join('');
                }
            }
        })
    </script>
    

    结果:
    原始字符串:yeyouluo!
    计算后反转字符串:!ouluoyey

    ①实例 中声明了一个计算属性 reversedMessage 。
    ②提供的函数将用作属性 vm.reversedMessage 的 getter 。computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter 。具体可参考《菜鸟学习
    ③vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

    附:computed vs methods

    相同点:效果一样。
    区别:
    ①computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
    ②使用 computed 性能会更好,但是如果不希望缓存,可以使用 methods 属性。

    Vue.js 样式绑定

    1.1 切换多个class

    可以用 v-bind 来设置样式属性。
    可以在对象中传入更多属性用来动态切换多个 class 。

    html :

    <div id="app1">
        <div v-bind:class="{active:isActive,'text-danger':hasError}"></div>
    </div>
    

    css :

    <style>
        .active{
            100px;
            height: 100px;
            background-color: green;
        }
    
        .text-danger{
            background: red;
        }
    </style>
    

    javascript :

    <script>
        new Vue({
            el:'#app1',
            data:{
                isActive: true,
                hasError:true
            }
        })
    </script>
    

    示例中css结果会叠加。

    1.2 class绑定Object

    可以直接绑定数据里的一个对象。

    html :

    <div id="app2">
        <div v-bind:class="classObject"></div>
    </div>
    

    css同上。
    javascript :

    new Vue({
        el: '#app2',
        data: {
            classObject:{
                active:true,
                'text-danger':true
            }
        }
    })
    

    1.3 class绑定计算属性

    可以在这里绑定返回对象的计算属性。这是一个常用且强大的模式。

    html :

    <div id="app3">
        <div v-bind:class="classObject1"></div>
    </div>
    

    css同上。
    javascript :

    new Vue({
        el: '#app3',
        data:{
            isActive:true,
            error:null
        },
        computed:{
            classObject1:function(){
                return {
                    active: this.isActive && !this.error,
                    'text-danger':this.error && this.error.type === 'fatal'
                }
            }
        }
    });
    

    1.4 数组语法

    html :

    <div id="app4">
        <div v-bind:class="[activeClass, errorClass]"></div>
    </div>
    

    css同上。
    javascript :

    new Vue({
        el:'#app4',
        data:{
            activeClass: 'active',
            errorClass: 'text-danger'
        }
    })
    

    1.5 三元表达式切换class

    可以使用三元表达式来切换列表中的 class。

    html :

    <div id="app5">
        <div v-bind:class="[errorClass, isActive?activeClass:'']"></div>
    </div>
    

    css同上。
    javascript :

    new Vue({
        el:'#app5',
        data: {
            isActive:true,
            activeClass: 'active',
            errorClass: 'text-danger'
        }
    })
    

    2.1 内联样式

    html :

    <div id="app6">
        <div v-bind:style="{color:activeColor, fontSize:fontSize + 'px'}">叶莜落</div>
    </div>
    

    javascript :

    new Vue({
        el:'#app6',
        data:{
            activeColor:'green',
            fontSize:30
        }
    })
    

    2.2 内联样式:绑定到对象

    可以直接绑定到一个样式对象,让模板更清晰。

    html :

    <div id="app7">
        <div v-bind:style="styleObject">叶莜落</div>
    </div>
    

    javascript :

    new Vue({
        el:'#app7',
        data: {
            styleObject:{
                color:'green',
                fontSize:'30px'
            }
        }
    })
    

    2.3 内联样式:绑定多个对象

    html :

    <div id="app8">
        <div v-bind:style="[baseStyles,overridingStyles]">叶莜落</div>
    </div>
    

    javascript :

    new Vue({
        el:'#app8',
        data:{
            baseStyles:{
                color:'red',
                fontSize:'30px'
            },
            overridingStyles:{
                fontWeight:'bold'
            }
        }
    })
    

    注: fontWeight == 'font-weight'

    Vue.js 事件处理器

    1. 事件监听可以使用v-on指令来绑定

    html :

    <!--
        作者:叶莜落
        时间:2017-10-18
        描述:事件监听可以使用 v-on 指令
    -->
    <div id="app1">
        <button v-on:click="counter += 1">增加1</button>
        <p>这个按钮被点击了{{ counter }} 次。</p>
    </div>
    

    JavaScript :

    var app1 = new Vue({
        el: '#app1',
        data: {
            counter: 0
        }
    });
    

    2. v-on 可以接收一个定义的方法来调用JavaScript方法

    html :

    <!--
        作者:叶莜落
        时间:2017-10-18
        描述:v-on 可以接收一个定义的方法来调用JavaScript方法
    -->
    <div id="app2">
        <button v-on:click="greet">Greet</button>
    </div>
    

    JavaScript :

    var app2 = new Vue({
        el: '#app2',
        data: {
            name: 'Vue.js'
        },
        methods: {
            greet: function(event) {
                alert( 'Hello,'+ this.name + '!' );
                if( event ) {
                    alert( event.target.tagName )
                }
            }
        }
    })
    

    3. 内联JavaScript语句

    html :

    <!--
        作者:叶莜落
        时间:2017-10-18
        描述:内联JavaScript语句
    -->
    <div id="app3">
        <button v-on:click="say('Hi')">Say Hi</button>
        <button v-on:click="say('TKS')">Say TKS</button>
    </div>
    

    JavaScript :

    var app3 = new Vue({
        el: '#app3',
        methods: {
            say: function( message ) {
                alert(message)
            }
        }
    })
    

    Vue.js 表单

    1.text/textarea

    html :

    <!--
        作者:叶莜落
        时间:2017-10-18
        描述:用v-model绑定数据--普通表单元素text/textarea
    -->
    <div id="app1">
        <p>input 元素</p>
        <input type="text" v-model="message" placeholder="编辑我……"/>
        <p>消息是:{{message}}</p>
    
        <p>textarea元素:</p>
        <p style="white-space: pre">{{message2}}</p>
        <textarea cols="30" rows="10" v-model="message2" placeholder="多行文本输入……"></textarea>
    </div>
    

    javascript :

    var app1 = new Vue({
        el: '#app1',
        data: {
            message: '叶莜落',
            message2: 'https://yeyouluo.github.io'
        }
    })
    

    2.复选框

    html :

    <div id="app2">
        <p>单个复选框:</p>
        <input type="checkbox" id="checkbox" v-model="checked"/>
        <label for="checkbox">{{checked}}</label>
    
        <p>多个复选框:</p>
        <input type="checkbox" id="google" value="google" v-model="checkedNames"/>
        <label for="google">google</label>
        <input type="checkbox" id="baidu" value="baidu" v-model="checkedNames"/>
        <label for="baidu">baidu</label>
        <input type="checkbox" id="sogo" value="sogo" v-model="checkedNames"/>
        <label for="sogo">sogo</label>
        <br />
        <p>选择的值为:{{checkedNames}}</p>
    </div>
    

    javascript :

    var app2 = new Vue({
        el: '#app2',
        data: {
            checked: true,
            checkedNames: []
        }
    })
    

    3.单选框

    html :

    <div id="app3">
        <input type="radio" id="baidu" value="baidu" v-model="picked"/>
        <label for="baidu">百度</label>
        <br />
        <input type="radio" id="google" value="google" v-model="picked"/>
        <label for="google">谷歌</label>
        <br />
        <p>选中值为:{{picked}}</p>
    </div>
    

    javascript :

    var app3 = new Vue({
        el: '#app3',
        data: {
            picked: 'google'
        }
    })
    

    4.下拉列表

    html :

    <div id="app4">
        <select name="fruit" v-model="selected">
            <option value="">选择一个网站</option>
            <option value="www.baidu.com">Baidu</option>
            <option value="www.google.com">Google</option>
        </select>
    
        <div id="output">选择的网站是:{{ selected }}</div>
    </div>
    

    javascript :

    var app4 = new Vue({
        el: '#app4',
        data: {
            selected: ''
        }
    })
    

    Vue.js 组件:自定义html 和 事件

    组件可以扩展 HTML 元素,封装可重用的代码。

    注册一个全局组件语法格式如下:
    Vue.component(tagName, options)
    tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:
    <tagName></tagName>

    1. 全局组件

    所有实例都能用全局组件。

    html :

    <div id="app1">
        <yeyouluo></yeyouluo>
    </div>
    

    javascript :

    //注册
    Vue.component('yeyouluo',{
        template: '<h1>自定义全局组件!</h1>'
    })
    // 根实例
    var app1 = new Vue({
        el: '#app1'
    })
    

    总结 :
    ①使用Vue.component注册
    ②使用<tagName></tagName>调用

    2. 局部组件

    在实例选项中注册局部组件,组件只能在这个实例中使用。

    html :

    <div id="app2">
        <github></github>
    </div>
    

    javascript :

    var child = {
        template: '<h1>自定义局部组件:https://yeyouluo.github.io</h1>'
    }
    
    var app2 = new Vue({
        el: '#app2',
        components: {
            // <github> 将只在父模板可用
            github: child   
        }
    })
    

    总结 :
    ①注册局部组件就是定义了一个变量。
    ②在Vue实例components属性中绑定tagName和上面定义的变量。

    Vue.js 自定义指令

    Vue.js 路由

  • 相关阅读:
    (一)IOC 容器:【2】@ComponentScan 自动扫描组件&指定扫描规则
    (一)IOC 容器:【11】Aware 注入Spring底层组件
    (一)IOC 容器:【10】@Autowired 自动装配
    (一)IOC 容器:【3】@Scope 设置组件作用域
    (一)IOC 容器:【8】Bean组件的生命周期
    每日日报7月13日
    每日日报7月12日
    每日日报7月11日
    Prism中的WeakEventHandlerManager
    博客开通标记
  • 原文地址:https://www.cnblogs.com/helloIT/p/7715326.html
Copyright © 2011-2022 走看看