当前位置: 首页 > news >正文

asp网站开发国内外现状wordpress 转义

asp网站开发国内外现状,wordpress 转义,wordpress推广插件,网站seo找准隐迅推目录 1. 前言 2. 何时生效 3. 指令钩子函数 4. 如何生效 5. 总结 1. 前言 在Vue中#xff0c;除了Vue本身为我们提供的一些内置指令之外#xff0c;Vue还支持用户自定义指令。并且用户有两种定义指令的方式#xff1a;一种是使用全局API——Vue.directive来定义全局指令…目录 1. 前言 2. 何时生效 3. 指令钩子函数 4. 如何生效 5. 总结 1. 前言 在Vue中除了Vue本身为我们提供的一些内置指令之外Vue还支持用户自定义指令。并且用户有两种定义指令的方式一种是使用全局API——Vue.directive来定义全局指令这种方式定义的指令会被存放在Vue.options[directives]中另一种是在组件内的directive选项中定义专为该组件使用的局部指令这种方式定义的指令会被存放在vm.$options[directives]中。 可以看到无论是使用哪一种方式定义的指令它都是将定义好的指令存放在指定的地方而并不能让指令生效。那么定义的指令什么时候才会生效呢或者说它是如何生效的呢本篇文章就来带你探究自定义指令如何生效的内部原理。 2. 何时生效 我们知道指令是作为标签属性写在模板中的HTML标签上的那么又回到那句老话了既然是写在模板中的那它必然会经过模板编译编译之后会产生虚拟DOM在虚拟DOM渲染更新时除了更新节点的内容之外节点上的一些指令、事件等内容也需要更新。另外我们还知道虚拟DOM节点的更新不只是更新一个已有的节点也有可能是创建一个新的节点还有可能是删除一个节点等等这些都叫做虚拟DOM节点的更新那么既然虚拟DOM节点更新的概念这么大那到底该什么时候处理指令的相关逻辑执行指令函数让指令生效呢 其实在虚拟DOM渲染更新的时候它在执行相关操作的同时还会在每个阶段触发相应的钩子函数我们只需监听不同的钩子函数就可以在虚拟DOM渲染更新的不同阶段做一些额外的事情。下表给出了虚拟DOM在渲染更新的不同阶段所触发的不同的钩子函数及其触发时机 钩子函数名称触发时机回调参数init已创建VNode在patch期间发现新的虚拟节点时被触发VNodecreate已基于VNode创建了DOM元素emptyNode和VNodeactivatekeep-alive组件被创建emptyNode和innerNodeinsertVNode对应的DOM元素被插入到父节点中时被触发VNodeprepatch一个VNode即将被patch之前触发oldVNode和VNodeupdate一个VNode更新时触发oldVNode和VNodepostpatch一个VNode被patch完毕时触发oldVNode和VNodedestory一个VNode对应的DOM元素从DOM中移除时或者它的父元素从DOM中移除时触发VNoderemove一个VNode对应的DOM元素从DOM中移除时触发。与destory不同的是如果是直接将该VNode的父元素从DOM中移除导致该元素被移除那么不会触发VNode和removeCallback 所以我们只需在恰当的阶段监听对应的钩子函数来处理指令的相关逻辑从而就可以使指令生效了。 现在我们来设想一下在什么阶段处理指令的逻辑会比较合适仔细想一下当一个节点被创建成DOM元素时如果这个节点上有指令那此时得处理指令逻辑让指令生效当一个节点被更新时如果节点更新之前没有指令而更新之后有了指令或者是更新前后节点上的指令发生了变化那此时得处理指令逻辑让指令生效另外当节点被移除时那节点上的指令自然也就没有用了此时还得处理指令逻辑。 基于以上设想我们得出一个结论在虚拟DOM渲染更新的create、update、destory阶段都得处理指令逻辑所以我们需要监听这三个钩子函数来处理指令逻辑。事实上Vue也是这么做的代码如下 export default {create: updateDirectives,update: updateDirectives,destroy: function unbindDirectives (vnode: VNodeWithData) {updateDirectives(vnode, emptyNode)} }可以看到分别监听了这三个钩子函数当虚拟DOM渲染更新的时候会触发这三个钩子函数从而就会执行updateDirectives函数在该函数内部就会去处理指令的相关逻辑我们在下面会详细分析该函数内部是如何处理指令逻辑。 3. 指令钩子函数 Vue对于自定义指令定义对象提供了几个钩子函数这几个钩子函数分别对应着指令的几种状态一个指令从第一次被绑定到元素上到最终与被绑定的元素解绑它会经过以下几种状态 bind只调用一次指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted被绑定元素插入父节点时调用 (仅保证父节点存在但不一定已被插入文档中)。update所在组件的 VNode 更新时调用但是可能发生在其子 VNode 更新之前。componentUpdated指令所在组件的 VNode 及其子 VNode 全部更新后调用。unbind只调用一次指令与元素解绑时调用。 有了每个状态的钩子函数这样我们就可以让指令在不同状态下做不同的事情。 例如我们想让指令所绑定的输入框一插入到 DOM 中输入框就获得焦点那么我们就可以这样定义指令: // 注册一个全局自定义指令 v-focus Vue.directive(focus, {// 当被绑定的元素插入到 DOM 中时……inserted: function (el) {// 聚焦元素el.focus()} })在模板中使用该指令如下 input v-focus可以看到我们在定义该指令的时候我们将获取焦点的逻辑写在了inserted钩子函数里面这样就保证了当被绑定的元素插入到父节点时获取焦点的逻辑就会被执行。 同理我们也可以在一个指令中设置多个钩子函数从而让一个指令在不同状态下做不同的事。 OK有了这个概念之后接下来我们就来分析指令是如何生效的。 4. 如何生效 在第二章节中我们知道了当虚拟DOM渲染更新的时候会触发create、update、destory这三个钩子函数从而就会执行updateDirectives函数来处理指令的相关逻辑执行指令函数让指令生效。所以探究指令如何生效的问题就是分析updateDirectives函数的内部逻辑。 updateDirectives函数的定义位于源码的src/core/vdom/modules/directives.js文件中如下 function updateDirectives (oldVnode: VNodeWithData, vnode: VNodeWithData) {if (oldVnode.data.directives || vnode.data.directives) {_update(oldVnode, vnode)} }可以看到该函数的内部是判断了如果新旧VNode中只要有一方涉及到了指令那就调用_update方法去处理指令逻辑。 _update方法定义如下 function _update (oldVnode, vnode) {const isCreate oldVnode emptyNodeconst isDestroy vnode emptyNodeconst oldDirs normalizeDirectives(oldVnode.data.directives, oldVnode.context)const newDirs normalizeDirectives(vnode.data.directives, vnode.context)const dirsWithInsert []const dirsWithPostpatch []let key, oldDir, dirfor (key in newDirs) {oldDir oldDirs[key]dir newDirs[key]if (!oldDir) {// new directive, bindcallHook(dir, bind, vnode, oldVnode)if (dir.def dir.def.inserted) {dirsWithInsert.push(dir)}} else {// existing directive, updatedir.oldValue oldDir.valuedir.oldArg oldDir.argcallHook(dir, update, vnode, oldVnode)if (dir.def dir.def.componentUpdated) {dirsWithPostpatch.push(dir)}}}if (dirsWithInsert.length) {const callInsert () {for (let i 0; i dirsWithInsert.length; i) {callHook(dirsWithInsert[i], inserted, vnode, oldVnode)}}if (isCreate) {mergeVNodeHook(vnode, insert, callInsert)} else {callInsert()}}if (dirsWithPostpatch.length) {mergeVNodeHook(vnode, postpatch, () {for (let i 0; i dirsWithPostpatch.length; i) {callHook(dirsWithPostpatch[i], componentUpdated, vnode, oldVnode)}})}if (!isCreate) {for (key in oldDirs) {if (!newDirs[key]) {// no longer present, unbindcallHook(oldDirs[key], unbind, oldVnode, oldVnode, isDestroy)}}} }可以看到该方法内首先定义了一些变量如下 const isCreate oldVnode emptyNode const isDestroy vnode emptyNode const oldDirs normalizeDirectives(oldVnode.data.directives, oldVnode.context) const newDirs normalizeDirectives(vnode.data.directives, vnode.context)const dirsWithInsert [] const dirsWithPostpatch []isCreate:判断当前节点vnode对应的旧节点oldVnode是不是一个空节点如果是的话表明当前节点是一个新创建的节点。isDestroy:判断当前节点vnode是不是一个空节点如果是的话表明当前节点对应的旧节点将要被销毁。oldDirs:旧的指令集合即oldVnode中保存的指令。newDirs:新的指令集合即vnode中保存的指令。dirsWithInsert:保存需要触发inserted指令钩子函数的指令列表。dirsWithPostpatch:保存需要触发componentUpdated指令钩子函数的指令列表。 另外你可能还看到了在定义新旧指令集合的变量中调用了normalizeDirectives函数其实该函数是用来模板中使用到的指令从存放指令的地方取出来并将其格式进行统一化其定义如下 function normalizeDirectives (dirs,vm): {const res Object.create(null)if (!dirs) {return res}let i, dirfor (i 0; i dirs.length; i) {dir dirs[i]if (!dir.modifiers) {dir.modifiers emptyModifiers}res[getRawDirName(dir)] dirdir.def resolveAsset(vm.$options, directives, dir.name, true)}return res }以第三章节中的v-focus指令为例通过normalizeDirectives函数取出的指令会变成如下样子 {v-focus:{name : focus , // 指令的名称value : , // 指令的值arg:, // 指令的参数modifiers:{}, // 指令的修饰符def:{inserted:fn}} }OK,言归正传获取到oldDirs和newDirs之后接下来要做的事情就是对比这两个指令集合并触发对应的指令钩子函数。 首先循环newDirs并分别从oldDirs和newDirs取出当前循环到的指令分别保存在变量oldDir和dir中如下 let key, oldDir, dir for (key in newDirs) {oldDir oldDirs[key]dir newDirs[key] }然后判断当前循环到的指令名key在旧的指令列表oldDirs中是否存在如果不存在说明该指令是首次绑定到元素上的一个新指令此时调用callHook触发指令中的bind钩子函数接着判断如果该新指令在定义时设置了inserted钩子函数那么将该指令添加到dirsWithInsert中以保证执行完所有指令的bind钩子函数后再执行指令的inserted钩子函数如下 // 判断当前循环到的指令名key在旧的指令列表oldDirs中是否存在如果不存在那么说明这是一个新的指令 if (!oldDir) {// new directive, bind// 触发指令中的bind钩子函数callHook(dir, bind, vnode, oldVnode)// 如果定义了inserted 时的钩子函数 那么将该指令添加到dirsWithInsert中if (dir.def dir.def.inserted) {dirsWithInsert.push(dir)} }如果当前循环到的指令名key在旧的指令列表oldDirs中存在时说明该指令在之前已经绑定过了那么这一次的操作应该是更新指令。 首先在dir上添加oldValue属性和oldArg属性用来保存上一次指令的value属性值和arg属性值然后调用callHook触发指令中的update钩子函数接着判断如果该指令在定义时设置了componentUpdated钩子函数那么将该指令添加到dirsWithPostpatch中以保证让指令所在的组件的VNode及其子VNode全部更新完后再执行指令的componentUpdated钩子函数如下 else {// existing directive, updatedir.oldValue oldDir.valuedir.oldArg oldDir.argcallHook(dir, update, vnode, oldVnode)if (dir.def dir.def.componentUpdated) {dirsWithPostpatch.push(dir)} }最后判断dirsWithInsert数组中是否有元素如果有则循环dirsWithInsert数组依次执行每一个指令的inserted钩子函数如下 if (dirsWithInsert.length) {const callInsert () {for (let i 0; i dirsWithInsert.length; i) {callHook(dirsWithInsert[i], inserted, vnode, oldVnode)}} }从上述代码中可以看到并没有直接去循环执行每一个指令的inserted钩子函数而是新创建了一个callInsert函数当执行该函数的时候才会去循环执行每一个指令的inserted钩子函数。这又是为什么呢 这是因为指令的inserted钩子函数必须在被绑定元素插入到父节点时调用那么如果是一个新增的节点如何保证它已经被插入到父节点了呢我们之前说过虚拟DOM在渲染更新的不同阶段会触发不同的钩子函数比如当DOM节点在被插入到父节点时会触发insert函数那么我们就知道了当虚拟DOM渲染更新的insert钩子函数被调用的时候就标志着当前节点已经被插入到父节点了所以我们要在虚拟DOM渲染更新的insert钩子函数内执行指令的inserted钩子函数。也就是说当一个新创建的元素被插入到父节点中时虚拟DOM渲染更新的insert钩子函数和指令的inserted钩子函数都要被触发。既然如此那就可以把这两个钩子函数通过调用mergeVNodeHook方法进行合并然后统一在虚拟DOM渲染更新的insert钩子函数中触发这样就保证了元素确实被插入到父节点中才执行的指令的inserted钩子函数如下 if (dirsWithInsert.length) {const callInsert () {for (let i 0; i dirsWithInsert.length; i) {callHook(dirsWithInsert[i], inserted, vnode, oldVnode)}}if (isCreate) {mergeVNodeHook(vnode, insert, callInsert)} else {callInsert()} }同理我们也需要保证指令所在的组件的VNode及其子VNode全部更新完后再执行指令的componentUpdated钩子函数所以我们将虚拟DOM渲染更新的postpatch钩子函数和指令的componentUpdated钩子函数进行合并触发如下 if (dirsWithPostpatch.length) {mergeVNodeHook(vnode, postpatch, () {for (let i 0; i dirsWithPostpatch.length; i) {callHook(dirsWithPostpatch[i], componentUpdated, vnode, oldVnode)}}) }最后当newDirs循环完毕后再循环oldDirs如果某个指令存在于旧的指令列表oldDirs而在新的指令列表newDirs中不存在那说明该指令是被废弃的所以则触发指令的unbind钩子函数对指令进行解绑。如下 if (!isCreate) {for (key in oldDirs) {if (!newDirs[key]) {// no longer present, unbindcallHook(oldDirs[key], unbind, oldVnode, oldVnode, isDestroy)}} }以上就是指令生效的全部逻辑。所谓让指令生效其实就是在合适的时机执行定义指令时所设置的钩子函数。 5. 总结 本篇文章介绍了关于自定义指令如何生效的相关内容。 首先我们知道了如果一个DOM节点上绑定了指令那么在这个DOM节点所对应虚拟DOM节点进行渲染更新的时候不但会处理节点渲染更新的逻辑还会处理节点上指令的相关逻辑。具体处理指令逻辑的时机是在虚拟DOM渲染更新的create、update、destory阶段。 接着我们介绍了Vue对于自定义指令定义对象提供了几个钩子函数这几个钩子函数分别对应着指令的几种状态我们可以根据实际的需求将指令逻辑写在合适的指令状态钩子函数中比如我们想让指令所绑定的元素一插入到DOM中就执行指令逻辑那我们就应该把指令逻辑写在指令的inserted钩子函数中。 接着我们逐行分析了updateDirectives函数在该函数中就是对比新旧两份VNode上的指令列表通过对比的异同点从而执行指令不同的钩子函数让指令生效。 最后一句话概括就是所谓让指令生效其实就是在合适的时机执行定义指令时所设置的钩子函数。
文章转载自:
http://www.morning.cptzd.cn.gov.cn.cptzd.cn
http://www.morning.bctr.cn.gov.cn.bctr.cn
http://www.morning.qczpf.cn.gov.cn.qczpf.cn
http://www.morning.rkfh.cn.gov.cn.rkfh.cn
http://www.morning.ykswq.cn.gov.cn.ykswq.cn
http://www.morning.spqbp.cn.gov.cn.spqbp.cn
http://www.morning.mprtj.cn.gov.cn.mprtj.cn
http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn
http://www.morning.mrccd.cn.gov.cn.mrccd.cn
http://www.morning.jjzxn.cn.gov.cn.jjzxn.cn
http://www.morning.yjtnc.cn.gov.cn.yjtnc.cn
http://www.morning.tongweishi.cn.gov.cn.tongweishi.cn
http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn
http://www.morning.mgskc.cn.gov.cn.mgskc.cn
http://www.morning.jntcr.cn.gov.cn.jntcr.cn
http://www.morning.tdcql.cn.gov.cn.tdcql.cn
http://www.morning.rpljf.cn.gov.cn.rpljf.cn
http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn
http://www.morning.nlgmr.cn.gov.cn.nlgmr.cn
http://www.morning.ygwbg.cn.gov.cn.ygwbg.cn
http://www.morning.qjghx.cn.gov.cn.qjghx.cn
http://www.morning.ktrh.cn.gov.cn.ktrh.cn
http://www.morning.tymwx.cn.gov.cn.tymwx.cn
http://www.morning.mcgsq.cn.gov.cn.mcgsq.cn
http://www.morning.dqzcf.cn.gov.cn.dqzcf.cn
http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn
http://www.morning.wbqk.cn.gov.cn.wbqk.cn
http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn
http://www.morning.lrzst.cn.gov.cn.lrzst.cn
http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn
http://www.morning.jpnfm.cn.gov.cn.jpnfm.cn
http://www.morning.hxxzp.cn.gov.cn.hxxzp.cn
http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn
http://www.morning.mqbsm.cn.gov.cn.mqbsm.cn
http://www.morning.sdkaiyu.com.gov.cn.sdkaiyu.com
http://www.morning.sjpht.cn.gov.cn.sjpht.cn
http://www.morning.jqbmj.cn.gov.cn.jqbmj.cn
http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn
http://www.morning.pxlql.cn.gov.cn.pxlql.cn
http://www.morning.lgnbr.cn.gov.cn.lgnbr.cn
http://www.morning.rsfp.cn.gov.cn.rsfp.cn
http://www.morning.qjfkz.cn.gov.cn.qjfkz.cn
http://www.morning.ypbp.cn.gov.cn.ypbp.cn
http://www.morning.vtbtje.cn.gov.cn.vtbtje.cn
http://www.morning.bauul.com.gov.cn.bauul.com
http://www.morning.kngx.cn.gov.cn.kngx.cn
http://www.morning.xhklb.cn.gov.cn.xhklb.cn
http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn
http://www.morning.kflpf.cn.gov.cn.kflpf.cn
http://www.morning.rksnk.cn.gov.cn.rksnk.cn
http://www.morning.fkdts.cn.gov.cn.fkdts.cn
http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn
http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn
http://www.morning.kcxtz.cn.gov.cn.kcxtz.cn
http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn
http://www.morning.smry.cn.gov.cn.smry.cn
http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn
http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn
http://www.morning.jmllh.cn.gov.cn.jmllh.cn
http://www.morning.rdgb.cn.gov.cn.rdgb.cn
http://www.morning.gthwr.cn.gov.cn.gthwr.cn
http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn
http://www.morning.smxrx.cn.gov.cn.smxrx.cn
http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn
http://www.morning.qnklx.cn.gov.cn.qnklx.cn
http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn
http://www.morning.pdkht.cn.gov.cn.pdkht.cn
http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn
http://www.morning.gnwse.com.gov.cn.gnwse.com
http://www.morning.fengnue.com.gov.cn.fengnue.com
http://www.morning.nicetj.com.gov.cn.nicetj.com
http://www.morning.lsxabc.com.gov.cn.lsxabc.com
http://www.morning.jcffp.cn.gov.cn.jcffp.cn
http://www.morning.xknmn.cn.gov.cn.xknmn.cn
http://www.morning.rfmzs.cn.gov.cn.rfmzs.cn
http://www.morning.wlqbr.cn.gov.cn.wlqbr.cn
http://www.morning.kndyz.cn.gov.cn.kndyz.cn
http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn
http://www.morning.kzpy.cn.gov.cn.kzpy.cn
http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn
http://www.tj-hxxt.cn/news/241671.html

相关文章:

  • 网站开发实用技术相关论文品牌建设英文
  • 怎样审请网站全国最大网站建站公司
  • 江西响应式网站制作网页传奇游戏中心
  • 做视频播放网站 赚钱wordpress线下安装教程
  • 服装网站设计策划书范文做网站设计工作的报告
  • 山东中讯做网站怎么样最新企业所得税优惠政策2023年
  • 网页开发与网站开发英语外贸网站建设
  • 帮别人设计网站的网站广州公关公司排行榜
  • 以前做的网站怎么才能登陆后台东莞常平碧桂园铂悦府
  • 正规的网站建设官网公司网站内容的更新
  • 台州云推广网站杭州app开发公司哪家好
  • ICP备案和实际网站不是一个名字网站建设哪家好推荐万维科技
  • 网站设置了字体为黑体怎么改字体51做网站建设企业官网
  • 招远做网站公司重庆网站外包
  • 上海企业网站怎么建设wordpress 编辑器引用
  • 陇南市响应式网站建设开发jsp网站
  • 浏阳 做网站wordpress更改首页
  • WordPress nex网站建设优化服务公司
  • 网站型营销软件开发定制图片
  • php购物网站设计代码软件开发图片
  • 做视频在哪个网站收益高建设银行网站地址
  • 企业管理系统的构成状况平台关键词排名优化
  • 孝感做网站公司做网站负责人有法律风险吗
  • 做网站的竞品分析陕西百度公司
  • 个人博客网站如何做SEO重庆公司章程在哪里下载
  • 快速做网站哪家好织梦wap网站模板
  • 80端口被封怎么做网站营业执照注册
  • 深圳企业做网站公qq网站登录入口
  • 甘肃省交通建设集团有限公司网站如何设置标签wordpress
  • 成都网站建设公司司雨人网站建设