• 组件基础—Vue学习笔记


    ammm学习Vue有好几天了,今天遇到难点所以打算写一点随笔加深印象。

    一、首先最简单的创建组件

    1全局组件   Vue.component()

    Vue.component('hello',{
            template:'<h1>hello world<h1>'
        })

    然后就可以调用了,前提:你需要先设置Vue的接管范围

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello World</title>
        <script src="Vue.js"></script>
    </head>
    <body>
        <div id="vm">
            <hello></hello>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            template:'<h1>hello world<h1>'
        })
    
        new Vue({
            el:'#vm'
        })
    </script>
    </html>

    2.  局部组件

    先在外部声明,然后在Vue实例中实例化

    var hello={
            template:'<h1>hello world</h1>'
        }
        var app=new Vue({
            el:'#app',
            components:{
                hello:hello       //在此处生成局部组件两个hello可以不同
            }
        })

    二、组件传值

    1.父组件向子组件传值

    最简单的方法通过 <slot></slot>传值

    <hello></hello>里面的hiboy会传递到子组件中替代slot

    <body>
        <div id="app">
            <hello>hiboy</hello>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            template:'<h1><slot></slot></h1>'
        })
        var app=new Vue({
            el:'#app'
        })
    </script>

    常规方法通过props传值

    <body>
        <div id="app">
            <hello message="hi boy"></hello>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            props:['message'],//此处的值和dom里的值对应
            template:'<h1>{{message}}</h1>'//通过插值表达绑定数据
        })
        var app=new Vue({
            el:'#app'
        })
    </script>

    当然我们可能会遇到像这样的Bug

    (当你在一个表格中使用组件时会发现...)

    <body>
        <div id="app">
            <table>
                <tbody>
                    <hello></hello>
                    <hello></hello>
                </tbody>
            </table>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            template:'<tr>Hi boy</tr>'//通过插值表达绑定数据
        })
        var app=new Vue({
            el:'#app'
        })
    </script>

    我们想要在表格的tbody中插入两个组件,组件为tr但是仔细看一下运行后的Dom

    我们会发现插入的两个组件并没有在我们预想的tbody中(疑惑...)

    解决方法:采用 is 声明

    <body>
        <div id="app">
            <table>
                <tbody>
                    <tr is="hello"></tr>//采用is把tr转化为hell组件
                    <hello></hello>
                </tbody>
            </table>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            template:'<tr>Hi boy</tr>'//通过插值表达绑定数据
        })
        var app=new Vue({
            el:'#app'
        })
    </script>

    看一下运行结果吧!

    类似于以上情况的标签有 table、select、ul、ol

     2.子组件向父组件传值

    子组件向父组件传值主要通过向上层传递事件实现所需函数$emit(’事件名‘,值)//值可为空也可多个

    <body>
        <div id="app">
            <hello @addnum="handleAddClick"></hello><!-- 接收子节点传过来的值 -->
            <h3>{{num}}</h3>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            data:function(){                              //组件的data为一个函数
                return{
                    number:0
                }
            },
            template:'<p @click="handleClick">{{number}}</p>',//number为data返回的值
            methods:{
                handleClick:function(){
                    //这里点击一次我们让自身加一
                    this.number++;
                    //向上传递事件给父节点
                    this.$emit('addnum',1);//第一个参数为事件名,第二个为所需要传的值,这里我们传1,当然可以传多个值
                }
            }
        })
        var app=new Vue({
            el:'#app',
            data:{
                num:0
            },
            methods:{
                handleAddClick:function(step){
                    this.num+=step;
                }
            }
        })
    </script>

    注意:组件的data是一个函数通过返回值来实现

    接下来我们通过两个子组件的值计算出父组件的值。此时我们会引入一个新的东西 ref 它可以让我们获取所需dom

    <body>
        <div id="app">
            <hello @addnum="handleAddClick" ref="one"></hello><!-- 接收子节点传过来的值 -->
            <hello @addnum="handleAddClick" ref="two"></hello>
            <h3>{{num}}</h3>
        </div>
    </body>
    <script>
        Vue.component('hello',{
            data:function(){                              //组件的data为一个函数
                return{
                    number:0
                }
            },
            template:'<p @click="handleClick">{{number}}</p>',//number为data返回的值
            methods:{
                handleClick:function(){
                    //这里点击一次我们让自身加一
                    this.number++;
                    //向上传递事件给父节点
                    this.$emit('addnum');
                }
            }
        })
        var app=new Vue({
            el:'#app',
            data:{
                num:0
            },
            methods:{
                handleAddClick:function(){
                    this.num=this.$refs.one.number+this.$refs.two.number;
                }
            }
        })
    </script>

    通过this.$refs.one我们可以获得ref="one"的组件以及其内的所以内容,

    this.$refs.one.number获取了组件中的number

    Ok就是这样,至于最基础的模板语法就自己看官方文档吧。

  • 相关阅读:
    mybatis实战教程(mybatis in action),mybatis入门到精通
    jquery 设置select的默认值
    一些最佳做法,即将推出的产品列表
    My97DatePicker日历控件日报、每周和每月的选择
    Android在第三方应用程序系统应用尽早开始,杀死自己主动的第三方应用程序,以重新启动
    Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)
    Arcgis sde 10.1您不能创建在安装后的空间库,提示User has privileges required to create database objects.
    cocos2d-x 网络请求
    HDU 3729 I&#39;m Telling the Truth(二部图最大匹配+结果输出)
    解决opengl计算顶点的法线问题
  • 原文地址:https://www.cnblogs.com/tcxq/p/10299877.html
Copyright © 2020-2023  润新知