前端框架Vue学习09——组件

组件与模块的区别

组件:组件的出现就是为了拆分vue实例代码量的,能够让我们以不同的组件来划分不同的功能模块。
所谓模块化是从代码逻辑的角度进行划分的,方便代码分层开发,保证每个功能模块的职能单一;组件化,是从UI界面的角度进行划分的,前端的组件化,方便UI组件的重用。

全局组件定义的三种方式

1、使用Vue.extend配合Vue.component方法:

<script>
        //1.1 使用Vue.extend来创建全局的Vue组件
        var com1 = Vue.extend({
            template: '<h3>this is a h3</h3>' //通过template属性,指定组件要展示的HTML结构         
        })
        //1.2 使用Vue.component('组件的名称',创建出来的组件模板对象)
        Vue.component('myCom1', com1)
        //Vue.component第一个参数,组建的名称在将来引用组建的时候,就是一个标签形式的他来引入
        //第二个参数 Vue.extend创建的组件,其中 template就是组件将来要展示的HTML内容
        //也可以像如下直接这么写
        // Vue.component('myCom1', Vue.extend({
        //     template: '<h3>This is a h3</h3>'
        // }))
    </script>

div部分

<div id="app">
        <!--如果要使用组件,直接把组件的名称,以HTML的形式引入到页面中即可}-->
        <!--注意如果用驼峰形式的命名, 要用横杠并取消大写-->
        <my-com1>
        </my-com1>
</div>

2、直接使用Vue.component方法:

//注意无论用哪种方式创建出来的组件,组建的template属性指向的模板内容,必须有且只有唯一的一个根元素
Vue.component('mycom2',{
   template: '<h3>这是直接用Vue,component创建出来的组件</h3><span></span>'
})

3、将模板字符串定义到script标签中:

<div id="app">
    <mycom3></mycom3>
</div>
//这种方式的好处是在template里面有html代码的高亮提示
<template id="temp1">
    <div>
       <h1>这是在外部定义的组件结构</h1>
    </div>
</template>
<script>
Vue.component('mycom3', {
    template:'#temp1'
})
</script>

定义私有组件

<div id="app">
        <login>
        </login>
</div>

<template id = 'temp'>
        <h1>this is a private component</h1>
    </template>
<script>

var vm = new Vue({
            // 私有
            el:'#app',
            data:{},
            methods: {},
            filters:{},
            directives:{},
            components:{
                //定义实例内部私有组件
                login:{
                    template:'#temp'
                }
            },

            beforeCreate(){},
            created(){},
            beforeMount(){},
            mounted(){},
            updated(){},
            beforeDestory(){},
            destoryed(){},
        })
</script>

为什么组件的data必须是一个函数,返回值是一个对象

有以下三点需要明确

1 组件可以有自己的data数据
2 组件的data必须是一个方法,并且方法必须返回一个对象
3 组件中的data数据使用方法和实例中的data使用方法是一样的

	<div id="app">
        <counter></counter>
        <hr>
        <counter></counter>
    </div>
    <template id="temp1">
        <div>
            <input type="button" value="+1" @click = "increment">
            <h3> {{count}} </h3>
        </div>
    </template>
    <script>
        // 计数器组件,我们在这里定义一个对象
        var dataObj={ count: 0 }
        Vue.component('counter',{

            template:"#temp1",
            data:function(){
            //这里返回dataObj,理论上是可以的
                return dataObj
            },
            methods:{
                increment(){
                    this.count++;
                }
            }   
        })
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {}
        });
    </script>
</body>

结果就是
在这里插入图片描述
两个实例的数据串用,这是因为datObj是一个对象,对象属于引用类型,我们在 div#app 放置了两个counter组件,那这两个组件内部数据返回的对象永远都指向dataObj这一对象,也就是这两个counter实例共享了同一个data数据
所以将data的返回值改成

return{
   count:0
}

这样一来每当创建一个新的组件实例,就会调用data中的函数,这个data 函数就会return 一个新开辟的对象。这样才能保证每个实例的data才是独有的。
结果如下:
在这里插入图片描述

组件切换—v-if

html代码:

	<div id="app">
        <a href="" @click.prevent="flag=true">登录</a>
        <a href="" @click.prevent="flag=false">注册</a>

        <login v-if=flag></login>
        <resiger v-else=flag></resiger>
    </div>
    <script>
        Vue.component('login',{
            template:'<h3>登录组件</h3>'
        })
        Vue.component('resiger',{
            template:'<h3>注册组件</h3>'
        })
        var vm = new Vue({
            el: '#app',
            data: {
                flag:true
            },
            methods: {}
        });
    </script>

组件切换—component 及 is 属性

解决了v-if只能两者之间切换的问题

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue.js"></script>
</head>
<body>
    <div id="app">
        <a href="" @click.prevent="comName='login'">登录</a>
        <a href="" @click.prevent="comName='resiger'">注册</a>
        <!-- Vue提供了component 来展示对应组件的名称 -->
        <!-- component 是一个占位符 :is 属性 可以用来指定要展示的组件名称 -->
        <component :is="comName"></component>
        <!-- 当前学习得Vue提供的标签
         component template transition  transitionGroup
        -->
    </div>

    <script>
        // 组件名称是字符串
        Vue.component('login',{
            template:'<h3>登录组件</h3>'
        })
        Vue.component('resiger',{
            template:'<h3>注册组件</h3>'
        })
        var vm = new Vue({
            el: '#app',
            data: {
                //当前component中 :is绑定的组件名称
                comName: 'login'
            },
            methods: {}
        });
    </script>
</body>

</html>

未完待续。。。

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';


## 生成一个适合你的列表

- 项目
  - 项目
    - 项目

1. 项目1
2. 项目2
3. 项目3

- [ ] 计划任务
- [x] 完成任务

## 创建一个表格
一个简单的表格是这么创建的:
项目     | Value
-------- | -----
电脑  | $1600
手机  | $12
导管  | $1

### 设定内容居中、居左、居右
使用`:---------:`居中
使用`:----------`居左
使用`----------:`居右
| 第一列       | 第二列         | 第三列        |
|:-----------:| -------------:|:-------------|
| 第一列文本居中 | 第二列文本居右  | 第三列文本居左 | 

### SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
|    TYPE   |ASCII                          |HTML                         
|----------------|-------------------------------|-----------------------------|
|Single backticks|`'Isn't this fun?'`            |'Isn't this fun?'            |
|Quotes          |`"Isn't this fun?"`            |"Isn't this fun?"            |
|Dashes          |`-- is en-dash, --- is em-dash`|-- is en-dash, --- is em-dash|

## 创建一个自定义列表
Markdown
:  Text-to-HTML conversion tool

Authors
:  John
:  Luke

## 如何创建一个注脚

一个具有注脚的文本。[^2]

[^2]: 注脚的解释

##  注释也是必不可少的

Markdown将文本转换为 HTML*[HTML]:   超文本标记语言

## KaTeX数学公式

您可以使用渲染LaTeX数学表达式 [KaTeX](https://khan.github.io/KaTeX/):

Gamma公式展示 $\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N$ 是通过欧拉积分

$$
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
$$

> 你可以找到更多关于的信息 **LaTeX** 数学表达式[here][1].

## 新的甘特图功能,丰富你的文章

```mermaid
gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值