vue继承[vue继承render函数]

vue继承可能是相关行业人士都值得关注的知识,在此对vue继承render函数进行详细的介绍,并拓展一些相关的知识分享给大家,希望能够为您带来帮助!

vue.js的组件可以继承

init_mm.start_code = (unsigned long) _text;

init_mm.end_code = (unsigned long) _etext;

init_mm.end_data = (unsigned long) _edata;

init_mm.brk = (unsigned long) _end;

memcpy(boot_command_line, from, COMMAND_LINE_SIZE);

boot_command_line[COMMAND_LINE_SIZE-1] = ‘0’;

parse_cmdline(cmdline_p, from); //处理编译内核时指定的cmdline或u-boot传递的cmdline

paging_init(meminfo, mdesc);

request_standard_resources(meminfo, mdesc);

#ifdef CONFIG_SMP

smp_init_cpus();

#endif

cpu_init();

init_arch_irq = mdesc-init_irq;

system_timer = mdesc-timer;

init_machine = mdesc-init_machine;

#ifdef CONFIG_VT

#if defined(CONFIG_VGA_CONSOLE)

conswitchp = vga_con;

#elif defined(CONFIG_DUMMY_CONSOLE)

conswitchp = dummy_con;

#endif

#endif

early_trap_init();

}

在初学 Vue 的时候,都是利用 cdn 的方式在一个页面中导入 vue.js 的库文件.

接着,肯定就学到了组件开发.

当然,也是在单页面中.

API文档告诉我们

在后来,学到了使用 vue-cli 搭配 .vue 模板的方式开发组件.

好了,三种组件创建的方式说完了,且在各自的环境里都能够正常的运作.

在 Vue 开发中,所有的组件本质上都是由一个继承自 Vue 的构造函数创建的.

比如在注册局部组件时.

从视觉上,我们看到 TodoListComp 只是一个普通的 Object 对象.

直接赋值给了其他组件的 components 属性里.

然后,这个组件就成为了一个局部组件,并可以在注册了当前组件的内部去使用了.

那它在内部做了什么,导致这个普通的对象最后可以被当成是一个正常的组件来使用呢?

比如,普通对象上都没有 $el 之类的属性.丢给 components 之后,就啥都有了.

使用Vue.extend(options)会根据传入的options创建一个VueComponent的组件构造函数并返回.

既然使用 Vue.extend 会返回一个组件的构造函数.

那么我们就可以使用 new 这个返回的构造函数

并手动的 mount 并替换某个 dom 节点(就和 new App() 一样)

前面,我么已经知道了,所有的 vue 组件,不管是全局的还是局部的.

都是利用 Vue.extend 方法构建并返回出一个继承自 Vue 的组件构造函数.

这个函数接受一个满足了 Vue 组件属性项的普通的 Object 对象.

在.vue模板文件开发中,也不例外.

我们可以看看,在书写 .vue 模板文件时,我们到底在写什么?

我们写的是一个 .vue 文件.

并按照 template/template script/script ( 这里不关注 style/style 节点 ) 的格式编写 .vue 文件.

把它整合起来来看.

等价于

好了,继续回到 .vue 模板开发文件中.

在另外一个组件中,使用此组件时,我们会 import xxx from xxx.vue 并搭配 components:{ xxxx }

.vue 会被 webpack 中配置的 vue-loader 处理.这是我们已知的.

结合上述的判断, vue-loader 仅仅只是把 .vue 文件编译成了一个 vue.extend(options) 创建组件所需要的 options 普通对象而已.

既然 vue-loader 仅仅,只是把 .vue 模板文件编译成了一个 options 普通对象.

那么我们可以手动的使用 Vue.extends(options) 来获得这个组件对象的构造函数.

拿到此组件的构造函数,我们就可以在 组件 mounted 的时候,通过 new 的方式,挂在到 html 上了. (而无需去注册到 components,成为一个局部组件.直接把它当成一个自己熟悉的不能在熟悉的构造函数调用即可.)

既然我们已经知道:

我们完全可以直接使用 .js 文件的方式来创建 vue 组件,进而省略 .vue vue-loader 这个执行的步骤.

此 .js 文件到处一个 vue 组件的构造函数.

在另外一个组件里

通过这样的原理,我们完全可以在HTML页面的任意地方,任意位置,任意的挂在我们自己的组件.并不一定必须使用.vue声明式组件的语法.

[ 码云地址 ]

Vue组件 本质上是一个有预定义选项的Vue实例,

指令 带有v- 前缀的特殊特性。作用是 当表达式的值改变时,将其长生的连带影响,响应式地作用于DOM

1 接收父组件传来的参数

组件标签中通过blog-post post-title=”hello!”/blog-post 传入

2 子组件中js中的props:[postTitl]设置属性

3 可以设置数据类型

props:{

title:String,

likes:Number,

isPublished:Boolean,

commentIds:Array,

author:Object

}

4 接收动态赋值

5 传入一个对象的所有属性

6 prop 为单向数据流

所有的prop都是从父组件传到子组件,单向下行绑定,子组件不应该更改prop数据

允许更改的方法

7 替换合并

如果我们从父级组件传入的属性会替换掉子组件原本的属性但是如果是style class会合并起来

form-control,这是在组件的模板内设置好的

date-picker-theme-dark,这是从组件的父级传入的 他的class 为 form-control date-picker-theme-dark 两者合并

8 禁用特性继承

1 命名规则 事件命不会自动转化大小写。触发的事件命和监听的事件命必须一样

2 将原生事件绑定到组件上

在父组件中给子组件绑定一个原生的事件,就将子组件变成普通的HTML标签,不加”.native”事件无法触发

3 $listeners

4 .sync修饰符

当一个子组件改变了一个prop中的值时。父组件中的值也改变

注意

有多个属性时当做对象传入

1 语法

2 编译作用域

3 具名插槽

4 作用域插槽

可以从子组件接收数据,并定义渲染的方式

使用is特性来切换组件

keep-alive 将元素动态组件包括起来,组件会被缓存

注意被包括的组件都有自己的名字,不论是name属性 还是局部/全局注册的

定义的时候什么都不做,只有在组件渲染的时候进行加载并缓存,以备下次访问

Vue实现按需加载

异步加载的组件在打包的时候,会打包成单独的js文件。通过ajax请求回来插入到HTML中。

1 每个new Vue实例的组件中。根实例都可以通过$root属性进行访问

2 ref获取DOM

给元素或组件一个ID然后在js中调用它

3 依赖注入provide inject

在父组件中使用provide定义个属性或者方法

在他的任意子组件中通过inject接收它

4 程序化的监听事件监听

1 父组件通过props把数据传给子组件

2 子组件可以使用$emit触发父组件的自定义事件

5 递归组件

组件可以在他自己的模板中调用自己。必须有name属性,没有name这个属性组件不能自己调用自己,递归的时候需要一个条件来终止递归,v-for

1 基本语法

主要用来服务Vue.component用来生成组件的。

简单说在模板中遇到以该组件命名的自定义标签时,会自动的调用扩展实构造器来生成组件,挂载到自定义元素标签上

Vue.component如果传入的普通对象内部会自动调用Vue.extend()生成对象组件然后通过Vue.component注册

将一些可复用的方法属性封装起来再需要的组件中使用(类似于reset.css)

1 如果混入的属性和方法与原来组件重合会与组件中的为主

2 混入对象的选项在元组件的选项之前调用

全局混入(全局注册的混入对象)

vue框架算是最近前端开发很好的工具。可以突破以前所没有实时更新页面。很有发展前景,很多大公司现在正在使用。

Vue框架诞生于2014年,其作者为中国人——尤雨溪,也是新人最容易入手的框架之一,不同于React和Angular,其中文文档也便于大家阅读和学习。Vue用于构建交互式的Web界面的库,是一个构建数据驱动的Web界面渐进式框架,该框架遵循CMD规范,并且提供的设计模式为MVVM模式(Model-View-View-Model)和一个可组合的组合型组件系统,具有简单的、灵活的API(接口)。该框架继承了React的虚拟DOM技术和Angular的双向数据绑定技术,是一款较新的功能性框架。

在这里介绍下什么是虚拟DOM和双向数据绑定:

1、虚拟DOM(Virtual DOM),顾名思义,从字面上理解就是虚构的DOM树,当我们用传统的原生API或者jQuery去操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。即使计算机硬件一直在更新迭代,但是操作真实DOM的代价仍旧很昂贵,真实的DOM节点,哪怕是一个最简单的div也包含很多属性,所以频繁的操作,会导致页面卡顿,影响用户的体验。为了解决这个浏览器性能问题,虚拟DOM(Virtual DOM)就被设计出来了,其核心算法是Diff算法。它会将一次操作过程中对真实DOM所有更新的diff内容保存到本地的一个js对象中,最终将这个js对象一次性attach到DOM树上,通知浏览器去执行绘制工作,避免了大量的无谓的计算量。

用js对象模拟DOM节点的好处是:页面的更新可以先全部反应在js对象上,操作内存中的js对象的速度明显要快的多。等更新完成后,在将最终的js对象映射成真实的DOM,交由浏览器去绘制。(提高了性能,并且运行速度快)

2、双向数据绑定,在讲双向数据绑定前,我们要想说下单向数据绑定,单向数据绑定,就是把Model绑定到View上,当我们用JavaScript代码更新Model时,View就会自动更新了(Model–View)。那么双向数据绑定就是,用户更新了View,Model的数据也会自动被更新(Model–View)。什么情况下用户可以更新View呢?举个最直接的例子,填写表单,当用户填写表单时,View的状态就被更新了,如果此时MVVM框架可以自动更新Model的状态,那么就相当于我们把Model和View做了双向数据绑定。其原理是我们要对input进行value 的属性绑定(v-bind:value=”…”)将Model中的变量绑定到View上(Model-View)以及当用户对input进行操作时,进行事件监听(v-on:input=”…”)将View上的更新传回Model中(View-Model)从而实现双向数据绑定,在Vue中,以上操作过于繁琐,便提供了v-model直接实现双向数据绑定的效果。

在进行Vue项目开发过程中,我们可以通过script标签引入式写法来引入vue或者是nodejs自带的包管理工具npm安装vue。并且通过new Vue()进行新建一个Vue的实例对象,其下有很多属性,包括el、data、methods、computed、watch等等,el为指向页面的节点元素,data存储数据,数据类型包括simple datatype(简单数据类型)以及complex datatype(复杂数据类型),用插值表达式{{}}显示,在插值显示的时候,不需要写上data,methods内存储方法,通过fn()的形式调用方法,computed内存储也是方法,但是其为计算数据,复杂逻辑的应该存储在computed中,计算属性是基于它们的依赖进行缓存的,由于computed带有一层缓存,所以只有在它的相关依赖发生改变时才会重新运行,而methods则是调用一次生成一次,computed中的方法调用时不需要加()的,watch为监听,监控,监听data中的属性值也可以监控对象,存在两个参数(currentValue当前值和prevValue之前值)。

这次给大家带来Vue组件开发有哪些技巧,Vue组件开发的注意事项有哪些,下面就是实战案例,一起来看一下。

Vue 单文件组件开发

当使用vue-cli初始化一个项目的时候,会发现src/components文件夹下有一个HelloWorld.vue文件,这便是单文件组件的基本开发模式。

// 注册

Vue.component(‘my-component’, {

template: ‘pA custom component!/p’

})

// 创建根实例

new Vue({

el: ‘#example’

})

下面,开始写一个dialog组件。

Dialog

目标对话框组件的基本样式如图:

根据目标样式,可以总结出:

dialog组件需要一个titleprops来标示弹窗标题

dialog组件需要在按下确定按钮时发射出确定事件(即告诉父组件确定了)

同理,dialog组件需要发射出取消事件

dialog组件需要提供一个插槽,便于自定义内容

那么,编码如下:

template

p class=”6b8a-b1c9-e8c6-25b2 ta-dialogwrapper”

p class=”b1c9-e8c6-25b2-8a6f ta-dialog”

?p class=”e8c6-25b2-8a6f-74c8 ta-dialogheader”

?span{{ title }}/span

?i class=”25b2-8a6f-74c8-5b06 ios-close-empty” @click=”handleCancel()”/i

?/p

?p class=”8a6f-74c8-5b06-b25d ta-dialogbody”

?slot/slot

?/p

?p class=”74c8-5b06-b25d-ff4e ta-dialogfooter”

?button @click=”handleCancel()”取消/button

?button @click=”handleOk()”确定/button

?/p

/p

/p

/template

script

export default {

name: ‘Dialog’,

props: {

title: {

?type: String,

?default: ‘标题’

},

},

methods: {

handleCancel() {

?this.$emit(‘cancel’)

},

handleOk() {

?this.$emit(‘ok’)

},

},

}

/script

这样便完成了dialog组件的开发,使用方法如下:

ta-dialog

title=”弹窗标题”

@ok=”handleOk”

@cancel=”handleCancel”

p我是内容/p

/ta-dialog

这时候发现一个问题,通过使用v-if或者v-show来控制弹窗的展现时,没有动画!!!,看上去很生硬。教练,我想加动画,这时候就该transition组件上场了。使用transition组件结合css能做出很多效果不错的动画。下面增强dialog组件动画,代码如下:

template

transition name=”slide-down”

p class=”5b06-b25d-ff4e-1a4a ta-dialogwrapper” v-if=”isShow”

?// 省略

/p

/transition

/template

script

export default {

data() {

return {

?isShow: true

}

},

methods: {

handleCancel() {

?this.isShow = false

?this.$emit(‘cancel’)

},

handleOk() {

?this.isShow = true

?this.$emit(‘ok’)

},

},

}

/script

可以看到transition组件接收了一个nameprops,那么怎么编写css完成动画呢?很简单的方式,写出两个

关键class(css 的 className)样式即可:

.slide-down-enter-active {

animation: dialog-enter ease .3s;

}

.slide-down-leave-active {

animation: dialog-leave ease .5s;

}

@keyframes dialog-enter {

from {

opacity: 0;

transform: translateY(-20px);

}

to {

opacity: 1;

transform: translateY(0);

}

}

@keyframes dialog-leave {

from {

opacity: 1;

transform: translateY(0);

}

to {

opacity: 0;

transform: translateY(-20px);

}

}

就是这么简单就开发出了效果还不错的动效,注意transition组件的name为slide-down,而编写的动画的关键className为slide-down-enter-active和slide-down-leave-active。

封装Dialog做MessageBox

Element的MessageBox的使用方法如下:

this.$confirm(‘此操作将永久删除该文件, 是否继续?’, ‘提示’, {

confirmButtonText: ‘确定’,

cancelButtonText: ‘取消’,

type: ‘warning’

}).then(() = {

this.$message({

type: ‘success’,

message: ‘删除成功!’

});

}).catch(() = {

this.$message({

type: ‘info’,

message: ‘已取消删除’

}); ?

});

看到这段代码,我的感觉就是好神奇好神奇好神奇(惊叹三连)。仔细看看,这个组件其实就是一个封装好的dialog,

下面,我也要封装一个这样的组件。首先,整理下思路:

Element的使用方法是this.$confirm,这不就是挂到Vue的prototype上就行了

Element的then是确定,catch是取消,promise就可以啦

整理好思路,我就开始编码了:

import Vue from ‘vue’

import MessgaeBox from ’

const Ctur = Vue.extend(MessgaeBox)

let instance = null

const callback = action = {

if (action === ‘confirm’) {

if (instance.showInput) {

?instance.resolve({ value: instance.inputValue, action })

} else {

?instance.resolve(action)

}

} else {

instance.reject(action)

}

instance = null

}

const showMessageBox = (tip, title, opts) = new Promise((resolve, reject) = {

const propsData = { tip, title, …opts }

instance = new Ctur({ propsData }).$mount()

instance.reject = reject

instance.resolve = resolve

instance.callback = callback

document.body.appendChild(instance.$el)

})

const confirm = (tip, title, opts) = showMessageBox(tip, title, opts)

Vue.prototype.$confirm = confirm

至此,可能会疑惑怎么callback呢,其实我编写了一个封装好的dialog并将其命名为MessageBox,

它的代码中,有这样两个方法:

onCancel() {

this.visible = false

this.callback (this.callback.call(this, ‘cancel’))

},

onConfirm() {

this.visible = false

this.callback (this.callback.call(this, ‘confirm’))

},

没错,就是确定和取消时进行callback。我还想说一说Vue.extend,代码中引入了MessageBox,

我不是直接new MessageBox而是借助new Ctur,因为这样可以定义数据(不仅仅是props),例如:

instance = new Ctur({ propsData }).$mount()

这时候,页面上其实是还没有MessageBox的,我们需要执行:

document.body.appendChild(instance.$el)

如果你直接这样,你可能会发现MessageBox打开的时候没有动画,而关闭的时候有动画。解决方法也很简单,

appendChild的时候让其仍是不可见,然后使用类这样的代码:

Vue.nextTick(() = instance.visible = true)

这样就有动画了。

总结

通过transition和css实现不错的动画。其中,transition组件的name决定了编写css的两个关键类名为[name]-enter-active和[name]-leave-active

通过Vue.extend继承一个组件的构造函数(不知道怎么说合适,就先这样说),然后通过这个构造函数,便可以实现组件相关属性的自定义(使用场景:js调用组件)

js调用组件时,为了维持组件的动画效果可以先document.body.appendChild 然后Vue.nextTick(() = instance.visible = true)

都看完了嘛?相信现在您对vue继承有一个初级的认识了吧!也可以收藏页面获取更多vue继承render函数知识哟!区块链、虚拟币,我们是认真的!

vue继承[vue继承render函数]文档下载: PDF DOC TXT
文章来源: 肖肖
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2384272385@qq.com举报,一经查实,本站将立刻删除。