首页 > 其他分享 >5月1日总结

5月1日总结

时间:2023-05-08 21:12:43浏览次数:36  
标签:总结 Vue component 事件 template props 组件

局部注册
复制代码

const child = {
template: '

我是局部注册的组件

'
}
/*
通过components选项属性进行局部注册:
components: {
组件名称[字符串]: 组件对象
}
*/
new Vue({
el: '#app',
template: '',
components: {
'my-component': child
}
})

复制代码

demo:

通过组件组合(嵌套),构建大型的应用:
复制代码

const child = {
template: '

我是child组件

'
}

const father = {
template: '

我是father组件,我包含了:

',
components: {
'child-component': child
}
}

const grandFather = {
template: '

我是grandFather组件,我包含了:

',
components: {
'father-component': father
}
}

new Vue({
el: '#app',
template: '',
components: {
'my-component': grandFather
}
})

复制代码

demo:

通过new创建Vue实例, 全局注册组件,局部注册组件三者的使用频率(场景)

1.new Vue(), 尽管在Vue官方文档上在相当多的例子中使用到了创建Vue实例这个操作,实际上它的使用可能并没有你想象的那么平凡,在很多时候,它可能就只在挂载根实例的时候使用到

【这段话给写react框架的人看】

对 new Vue()做个最简单的描述!:在使用上类似于ReactDOM.render()...对,就是那个一开始你撸文档的时候觉得好像很重要,但最后发现在整个APP中就只使用了一次的那个顶层API ....

2.全局注册组件的使用也不太频繁,首先来说,如果大量使用全局注册的话,当然容易产生组件的命名冲突,这就意味着你在构建大型组件的时候,你不应该选择用全局注册构建具体的细颗粒度的组件(实际上即使是小型应用也不推荐啦~~~)

那么全局注册组件会在哪里使用到呢?

2.1 有许多可全局复用的公共UI组件,你可能希望通过Vue.component({ ...})的方式全局注册它

2.2 可以很简单地添加第三方UI框架

【对比】大凡使用过一些UI框架的人,都知道一般情况下,使用这些UI组件的方式就是为元素添加类,像这样:

而在Vue中,你可以通过直接使用组件名称去使用,就和react相关的UI框架一样

3.大多数时候我们通过组件组合的方式构建页面的时候,运用的是局部注册,就像上文所提及的那样

【注意点】

1.注册组件必须发生在根实例初始化前

2.data是函数!

回到顶部
Vue中的props数据流

【写给react学习者们看的】这跟react中设计非常类似,连名称都相同,所以学过react的同学看这里应该会很轻松吧~~

这里要用到Vue的一个选项属性——props;

通过在注册组件中声明需要使用的props,然后通过props中与模板中传入的对应的属性名,去取用这传入的值

例子:

model部分:
复制代码

Vue.component('my-component', {
props: ['name', 'birthTime'],
template: '

我叫:{{name}} 我出生于:{{birthTime}}

',
created: function () {
console.log('在created钩子函数中被调用')
console.log('我叫:', this.name)
console.log('我出生于:', this.birthTime)
}
})

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

复制代码

HTML部分:

demo:

你在注册组件的时候通过props选项声明了要取用的多个prop:

props: ['name', 'birthTime'],

然后在模板中通过属性传值的方式进行数据的注入:

再然后我们就可以在注册组件的模板中使用到props选项中声明的值了:

template: '

我叫:{{name}} 我出生于:{{birthTime}}

'

这里要注意几个点:
props取值的方式

1.如果是在注册组件的模板内部,直接通过prop的名称取就OK了,例如

template: '

我叫:{{name}} 我出生于:{{birthTime}}

'

2.如果在注册组件的其他地方,用this.prop的方式取用,例如

console.log('我叫:', this.name)

props内写的是驼峰命名法,为什么在HTML(模板)中又用了短横线命名法?

(camelCased VS kebab-case)

首先我们知道,Vue组件的模板可以放在两个地方:

  1. Vue组件的template选项属性中,作为模板字符串

2.放在index.html中,作为HTML

这里的问题在于,HTML特性是不区分大小写的

所以在Vue注册组件中通用的驼峰命名法,显然不适用于HTML中的Vue模板,所以

在HTML中写入props属性,必须写短横线命名法(就是把原来props属性中的每个prop大写换成小写,并且在前面加个“-”)

总结:

1.在template选项属性中,可以写驼峰命名法,也可以写短横线命名法

2.在HTML(模板)中,只能写短横线命名法,不能写驼峰

下面我就来证明以上两点:

对1
复制代码

Vue.component('my-component', {
props: ['name', 'birthTime'],
template: '

我叫:{{name}} 我出生于:{{birthTime}}

',
created: function () {
console.log('在created钩子函数中被调用')
console.log('我叫:', this.name)
console.log('我出生于:', this.birthTime)
}
})

new Vue({
el: '#app',
template: ''
})

复制代码

demo:

name和birthTime都正常显示,这说明在template模板字符串中,是可以写驼峰的

(请注意到一点:name既符合驼峰写法也符合短横线写法,而birthTime只符合驼峰写法)

JS部分
复制代码

Vue.component('my-component', {
props: ['name', 'birthTime'],
template: '

我叫:{{name}} 我出生于:{{birthTime}}

',
created: function () {
console.log('在created钩子函数中被调用')
console.log('我叫:', this.name)
console.log('我出生于:', this.birthTime)
}
})

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

复制代码

HTML(模板)部分

demo:

这里有个有趣的现象:name对应的值可以正常地显示,但!birthTime不能

这是因为上文提到的:

name既符合驼峰写法也符合短横线写法,而birthTime只符合驼峰写法,不符合HTML要求的短横线写法

使用v-bind的必要性:props不绑定的前提下,只能被作为字符串解析
复制代码

Vue.component('my-component', {
props: ['number'],
template: '

检测number的类型

',
created: function () {
console.log(typeof this.number)
}
})

new Vue({
el: '#app',
template: ''
})

复制代码

demo:

number被检测为字符串,这表明在不加v-bind绑定的情况下,props接受到的都是字符串,(注:如果被作为javacript,”1“会被解析为Number的1,而” ‘1’ “才会被解析为String的1)

没错,仅仅这一点就会让我们非常为难,所以,我们需要使用v-bind:

当使用v-bind的时候,在模板中props将会被作为javascript解析:
复制代码

Vue.component('my-component', {
props: ['number'],
template: '

检测number的类型

',
created: function () {
console.log(typeof this.number)
}
})

new Vue({
el: '#app',
template: ''
})

复制代码

demo:

这可能拓展我们对v-bind的认知:

1.用v-bind一般是为了做数据的动态绑定

2.有时v-bind并不为了实现点1,只是纯粹为了让字符串内的内容被当作JS解析罢了

回到顶部
Vue的自定义事件

自定义事件是我非常喜欢的Vue的一大特性!!! 看文档的第一眼我就对它情有独钟(虽然那一天离现在也就几天而已的时间。。。)

先展示代码和demo:
复制代码

Vue.component('button-counter', {
template: '',
data: function () {
return {
counter: 0
}
},

methods: {
increment: function () {
this.counter += 1
this.$emit('increment-event')
}
}
})

new Vue({
el: '#app',
data: {
totalCounter: 0
},

methods: {
total_increment: function () {
this.totalCounter += 1
}
}
})

复制代码

模板HTML部分:
复制代码


复制代码

demo:

下面两个按钮是两个相同的子组件,并和上面那个按钮共同组成了父组件。

当点击任意一个子组件的按钮,使其加1,都会使得父组件+1,最终:父组件的数值 = 子组件的数值之和

点击下方左边button

点击下方右边button

自定义事件的原理

通过$emit(event)触发一个自定义事件

然后通过$on(event,callback) 去执行对应的callback(回调函数)

(两个event是字符串,且必须名称相同)

但$on不能在父组件中监听子组件抛出的事件,所以我们要做到这一点,可以在父组件的模板中使用到子组件的时候,直接用v-on绑定 (和$on作用效果一致) 就像上面那样:

这样一来,自定义事件的雏形就变得和原生事件一样了

即使这样,上面的代码可能还是有些难理解,我认为比较重要的是这一段:

increment: function () {
this.counter += 1
this.$emit('increment-event')
}

因为我们对于事件的运用主要是:利用事件和函数绑定,从而在事件触发的时候能执行相印的函数

所以! 对于自定义事件,我们要解决的问题就是,“这个事件在什么时候被触发” 在上面的代码中,触发事件的时间(执行 this.$emit('increment-event')的时间)

就恰恰是执行this.counter += 1 的时候

自定义事件的作用

对此,我主要从两点阐述我的观点:(非官方文档内容,自己思考的,觉得不对的可以指出):
自定义事件的作用1 ——“重新定义”了事件监听机制的范围

MDN是这样描述DOM事件的:“DOM事件被发送以通知代码已发生的有趣的事。每个事件都由基于Event接口的一个对象表示”

在我看来:当你使用事件的时候,你可能试图做这样一件事情: 在某一个特定的时间节点(或场景)做某个操作,例如调用一个函数。 而定位这个“时间节点”或“场景”的,就是事件。而我们对事件最喜欢做的事情,就是把事件和某个函数给绑定起来

但我们可能一直都忽略了一个认知:我们认知范围内的事件,好像只有原生事件呀?例如click(点击),focus(聚焦),keydown(按键)

我们认知内的事件,难道只有这些个固定的范围吗?点击是事件,按下键盘按钮是事件。那么,我们能不能人为地定义一个事件呢? 例如上面的,我们通过代码处理,让"某个数据增加1"也作为一个事件,从而去触发一个函数呢?

这,就是自定义事件的目的和魅力

自定义事件的作用2 ——使得父子组件权责明确

就让我们看一下 父组件的这个模板吧,在这里,我们发现:

1.父组件不知道子组件究竟做了什么(increment事件触发前的处理),同时也无需关心

2.父组件只要完成它的任务:在increment事件触发的时候执行对应的函数就足够了

对子组件反是

所以,从这个角度上说,自定义事件使得父子组件“权责明确”

【注意】官方文档的示例可能容易制造这样一种错觉:自定义事件是以原生事件(如click)为基础的,但实际上并不是这样。

虽然自定义事件和原生事件息息相关,但自定义事件并不以原生事件的触发为基础的

回到顶部
Slot的使用

当你试图使用slot的时候,你可能试图做这样一件事情:

用父组件动态地控制子组件的显示的内容
复制代码

Vue.component('son-component', {
template: '

'
})

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

复制代码

模板HTML:
复制代码

这是slot的内容

你好,我是slot

复制代码

demo:

【写给react的同学看的】你可以把slot看作是个3.0版本的props.children

通俗的理解:

在父组件模板中使用子组件的时候,如果在子组件里面嵌套了HTML的内容,它会以”props“的方式传递给子组件的模板,并被子组件中的slot接受,例如:

【一个不太专业的说法】

你好,我是slot

等同于

具名slot

为了使增强slot的用法,使父组件能够更加灵活地控制子组件,Vue引入了具名slot

通过name属性,可以把在父组件中控制子组件同时渲染不同的slot
复制代码

Vue.component('son-component', {
template: '

'
})

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

复制代码

HTML模板部分:
复制代码

  <son-component>

    <h1 slot='h1' >我是标题</h1>

    <button slot='button'>我是按钮</button>

    <a href='#' slot='a'>我是链接</a>

  </son-component>

复制代码

demo:

【注意事项】

1.实际上,我觉得我这篇文章的语言有些过于罗嗦(其实很为难,因为说多了怕罗嗦——”太长不看“),说少了又怕不能完整地表达自己的意思,这是我权衡后的所做的结果

2.文中很多只为知识点服务,跟实际的项目构建存在很大差异,例如我把很多模板都放在template选项中,而实际上我们会使用Vue单文件组件来实现这些

【完】

我叫彭湖湾,请叫我胖湾
标签: Vue
好文要顶 关注我 收藏该文
外婆的
粉丝 - 1164 关注 - 10
推荐博客
+加关注
关注一下我呗~
123
14
« 上一篇: 【Vue】谈Vue的依赖追踪系统 ——搞懂methods watch和compute的区别和联系
» 下一篇: 【编程之外】 大二暑假 ——深信服实习小记
posted @ 2017-07-22 17:54 外婆的 阅读(19041) 评论(12) 编辑 收藏 举报

标签:总结,Vue,component,事件,template,props,组件
From: https://www.cnblogs.com/lmyy/p/17383157.html

相关文章

  • 5月5日总结
    博客园Logo首页新闻博问专区闪存班级搜索所有博客搜索当前博客搜索我的博客写随笔我的博客短消息用户头像我的博客我的园子账号设置简洁模式退出登录孤王就是朕路漫漫其修远兮,吾将上下而求索!websocket多实例推送解决方案-数据......
  • 5月4日总结
    2、Oracle函数分类Oracle函数分为单行函数和聚合函数单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果。常见的单行函数有如下四种①数值型函数:对数字进行计算,返回一个数字。②字符函数:对字符串操作。③转换函数:可以将一种数据类型转换为另外一种......
  • 5月3日总结
    Windows上安装nodejs版本管理器nvmnvm最新的下载地址Node版本管理器--nvm,可以运行在多种操作系统上。nvmforwindows是使用go语言编写的软件。我电脑使用的是Windows操作系统,所以我要记录下在此操作系统上nvm的安装和使用。下载nvm-windows最新下载地址:https://github.co......
  • 5月2日总结
    Node.js起步--(1)先来简单介绍nodeJS我们知道JavaScript是运行在浏览器中的,浏览器为它提供了一个上下文(context),从而让JavaScript得以解析执行。nodeJS其实可以这么理解,它是另外一种上下文,它允许在后端(脱离浏览器环境)解析执行JavaScript代码。因为它使用了Google的V8虚......
  • 5.8每日总结
    今天上了软件工程课,在课上老师讲了团队绩效考核的一些评价标准和需要注意的一些问题,意识到了在团队中的自我价值要通过自己的表现去争取,之后将要开展第二轮的团队项目的冲刺,并布置了期末的任务,后来在课上老师组织我们进行了一些团队合作活动。接下来将会和小组成员讨论下一阶段......
  • 每周总结5.1-5.7
    23.5.1-23.5.7总结如下,经过短暂的五一假期后,回到学习开始学习,本周进行了web,数据库sqllite以及matlab的学习,也学习了计算机网络及数据库组成原理以及最优化算法中的运筹学知识,在紧张的考试前一个月,能够比较合理的规划和安排复习与软工学习,并抽空进行英语的学习,报名了cet6(捐款)......
  • 5.8每日总结
    今天上了软件工程课,在课上老师讲了团队绩效考核的一些评价标准和需要注意的一些问题,意识到了在团队中的自我价值要通过自己的表现去争取,之后将要开展第二轮的团队项目的冲刺,并布置了期末的任务,后来在课上老师组织我们进行了一些团队合作活动。接下来将会和小组成员讨论下一阶段......
  • 【验证码逆向专栏】某验全家桶细节避坑总结
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 5.8之常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)
    目录背景知识XSS攻击SQL注入CSRF攻击背景知识从互联网诞生之初起,无时无刻不存在网络攻击,其中XSS攻击和SQL注入攻击是网站应用攻击的最主要的两种手段,全球大约70%的网站应用攻击都来自XSS攻击和SQL注入攻击。此外,常用的网站应用攻击还包括CSRF、Session劫持等。XSS攻击全......
  • 2023.5.8周学习总结
    一.本周计划1.继续复习图论知识2.vp一场省赛3.补cf和abc和牛客的题二.计划完成情况三.题解(158条消息)AtCoderBeginnerContest300(D-G)_scanner___yw的博客-CSDN博客四.总结1.这周打比赛的时候非常粗心,经常写错变量名,然后吃很多罚时,就很亏。......