Vue同一路由跳转页面不刷新解决方案及注意事项

默认情况跳转至同一个路由地址(path相同,即使params或者query不同也算同一个)的话,只是浏览器url变了,其它是不会发生任何变化,这就是网友常说的“同一页面跳转,路由变了但是页面不刷新”。 我们可以写两个测试页面 // goNext.vue <template> <section> <button @click="goNext">跳转至自身</button> <button @click="goBack">跳转至goBack</button> </section> </template> <script> export default { name: 'goNext', mounted() { console.log('组件生命周期 mounted', 'goNext'); this.showInfo(); }, beforeDestroy() { console.log('组件生命周期 beforeDestroy-> ', 'goNext'); }, beforeRouteEnter(to, from, next) { console.log('路由生命周期 beforeRouteEnter-> ', 'goNext'); next(); }, beforeRouteLeave(to, from, next) { console.log('路由生命周期 beforeRouteLeave-> ', 'goNext'); Read more…

antv G6流程图darge实现节点回溯连线

需要实现的效果就是这样 里面红线部分就是需要回溯的连线, 我们知道darge流程图连接节点是这样实现的 const data = { nodes: [ { id: '1', dataType: 'alps', name: 'alps_file1', conf: [ { label: 'conf', value: 'pai_graph.conf', }, { label: 'dot', value: 'pai_graph.dot', }, { label: 'init', value: 'init.rc', }, ], }, { id: '2', dataType: 'alps', name: 'alps_file2', conf: [ { label: 'conf', Read more…

wangEditor富文本编辑器改造记录之一——了解wangEditor结构

最近鉴于项目要求,需要对自己使用的富文本编辑器进行改造。 我们首先简单了解下wangEditor的源码结构 第一步:polyfill 当然现在这些基本都用不上了,现代点的浏览器都支持这些方法的 基于document封装了一套dom操作类DomElement 里面有forEach、css、show、on、addClass、children、find、parent、insertAfter等 然后将它改成类似jQuery的 function $(selector) { return new DomElement(selector); } 配置 根据用户配置和默认值合并成最终的配置 工具栏上的各类菜单功能组件 比如Head、Head、FontSize、Italic、Undo、ForeColor、Bold等,每个组件都可以注册在菜单组件Menu上,由菜单组件统一管理添加到工具栏上,几乎每个菜单功能组件都有一个_command方法,其主要功能就在这个方法中。 我们看一个设置颜色的组件ForeColor // 原型 ForeColor.prototype = { constructor: ForeColor, // 执行命令 _command: function _command(value, index) { var editor = this.editor; editor.cmd.do('foreColor', value); }, }; 其核心方法就是document的execCommand。 如果需要及时更新菜单功能组件的最新值(比如Bold组件查询当前位置是否已经加粗)来更新对应按钮的显示状态,就需要一个额外的方法tryChangeActive,所有功能组件的tryChangeActive方法会在执行了对应的command和保存选区时被调用。 怎么获取当前的最新值呢?尤其是那种从未通过菜单设置的地方? 以获取当前位置是否加粗的Bold为例 Bold.prototype = { constructor: Bold, Read more…

web前端开源流程图组件库调研记录

前期公司的一个项目需要绘制流程图,设计师给的效果大致是这样的 对,全是马赛克。 项目的大致要求如下: 点击流程节点后会弹出对应的流程详情,可以查看和编辑 最好是支持流程节点的拖拽来实现节点之间的层级改动 流程节点尽可能的居中 我就大致搜了下,找了不少不错的,但是都是付费的居多,比如gojs。 自己也看了几个开源的可以制作流程图的库,生成的全部是svg。 flowchart.js 效果图 缺点: 这样的数据结构真心让人喜欢不起来,连数组都不是 数据的位置完全把控不了 优点: 不用自己指定流程节点的位置 obfc obfc.js部分源代码 效果图 缺点: 库写的太简陋了,全部都用的是全局方法和变量。。。 需要指定流程节点的坐标位置(硬伤啊) 优点 库比较容易进行二次封装 Rappid/jointjs 它居然有开源版jointjs 缺点 流程节点的连线默认使用弧线连接的 优点 不用自己指定流程节点位置 流程节点会自己尽量居中 可以自己改造下,加一层节点,再想办法让它连续变成直线。 本来我是想拆分出里面的自动居中算法的,然后再结合前面几个库实现产品要求。看了它依赖几个库,一个是backbone,一个是dagre.js(里面又依赖graphlib.js) 这几个其实都不满意。 G6 前几天跟一个朋友说了下,他问我看过G6没有?G6?我听到没听过啊。看来我是孤陋寡闻了。 阿里的开源图可视化引擎,使用canvas画图的。 这是我根据产品要求用G6写的demo,怎么样?是不是很符合产品的要求啊。 哈哈,感谢朋友的推荐,感谢G6。 缺点: canvas,不是svg,感觉没有svg那样更容易控制,得全靠对api的熟悉程度 需要多熟悉熟悉文档 优点: 不用自己指定流程节点的位置 背后有阿里 可以不指定位置,然后自己根据内容的宽高再调整位置 4.继续发掘 最终的选型很明显了,肯定用G6了啊。

改造富文本编辑器wangEditor成react组件

我们知道wangEditor常用的功能是editor实例的txt.html()和txt.text()方法,尤其是txt.html()方法,这是一个类似与jQuery常用的那种get和set一体的方法。 我们怎么把这种传统模式书写的第三方库引入到react项目中,并且方便其它同事使用呢?我们需要做一个react组件,让它来完成wangEditor的“react化”。 对于编辑器这种,我们不太在乎它的生命周期,我们更适合将它封装成函数式组件。 我们在项目使用是只有使用ref拿到这个组件并且调用对应的方法来取到(设置)富文本里面的内容。 <WangEditor ref={this.richEditorRef} content={this.state.editShortcutReply.content}/> 这样在使用时就很方便啊,那我们的WangEditor组件怎么实现呢? import React, { useEffect, forwardRef, useImperativeHandle } from 'react'; import toaster from 'viewsUI/toaster'; import WangEditor from 'viewsUI/wangeditor/wangEditorForSetting' import wangEditorI18nLang from './i18nLang'; let richEditor = null; /*eslint-disable*/ const wangEditor = (props, ref) => { let unique = Math.random().toString(36).substr(2); useEffect(() => { console.log('wangEditor useEffect Read more…

转译:使用react hooks优化回调函数在组件间的传递,useState,useReducer?

我们先看一下使用useStatehooks写的todoList组件,里面我们需要层层传递回调函数。 import React, { useState } from "react"; const AddTodoBtn = ({ onAddTodo }) => ( <div className="action-add"> <button onClick={onAddTodo}>Add new todo</button> </div> ); const RemoveAllBtn = ({ onRemoveAll }) => ( <div className="action-remove-all"> <button onClick={onRemoveAll}>Remove all todos</button> </div> ); // This component and every one placed between the TodoList Read more…

参考教程实现WordPress更新博文通知钩子插件

搞一个更新博客文章的钩子插件,目前的功能是更新自己的PWA缓存版本 <?php /* Plugin Name: Daozhao Blog Description: wordpress操作post的钩子处理插件 Version: 1.1 Author: Shadow Prompt Author URI: https://www.daozhao.com License: GPLv2 */ if(defined('ABSPATH') && defined('WPINC')) { add_action("init", array("daozhaoBlog", "Enable"), 15, 0); register_activation_hook( __FILE__, 'activation'); register_deactivation_hook( __FILE__, 'deactivation' ); add_action('plugins_loaded', 'daozhao_footer_message_plugin'); register_uninstall_hook( __FILE__, 'uninstall' ); } function daozhao_footer_message_plugin() { echo `加载完成了`; add_action( 'wp_footer', Read more…

WordPress钩子Action Hook与Filter Hook

WordPress的Action Hook与Filter Hook WordPress中的 Hook 有两种,分别是Action Hook及Filter Hook,一开始你可以先把这两种 Hook 看成是一样的东西,只是 Filter 多了一点点不同的特色,接着说明。 Action Hook WP核心 (或主题、插件)在做它们该做的事时,如果执行到有埋action hook 的代码时,会去找寻对应到的hook functions,进而执行这些hook functions(即那些透过 add_action() 来加入的hook functions),藉此完成定制功能。WP核心并不期待Action Hook functions 会有回传值,所以这里的hook function只被视为一个”独立切出来运作的功能“。 WP核心做它该做的事,你做你想做的事,做完就各自结束。 Filter Hook 跟Action Hook一样,WP核心 (或主题、插件)在做它们该做的事时,如果执行到有埋 filter hook的代码即是apply_filters语法) 时,就会去找寻对应的hook functions,进而执行这些 hook functions(即那些透过add_filter()来加入的hook functions),藉此完成定制功能。与 Action Hook不同之处是,所有”鈎上“ Filter Hook的hook functions通常都会接收到参数,而WP核心会期待你拿到它提供的参数,并做完你想做的事后,要回传(return)一个值,让WP核心再利用你回传的值来接着完成它该做的事。 透过你的干涉,修改了WP核心丢给你的参数,WP核心再接着拿你改过的参数,继续完成它该做的事,此动作就像”过滤“的动作,因而得名filter。 比较Action Hook与Filter Hook的操作语法 比较一下两种 Read more…

小改wordpress的get_permalink,支持固定链接设置值和插件获取值不同

因为本站的前端展示放弃使用WordPress博客系统的,而是改用自己的vue服务端渲染了,在保留原来的链接地址(比如https://www.daozhao.com/8531.html)不变的情html况下,只能更改WordPress里面的固定链接了,只能委屈WordPress使用https://www.daozhao.com/8531.php这的链接了。 但是我这样的改造对于WordPress系统里面的插件等而已,它们并不知情,它们会继续用WordPress里面的方法get_permalink($post)来获取固定链接。比如我现在提到的生成sitemap插件google-sitemap-generator,我就需要简单改造下了,让生成的sitemap.xml里面显示的博文链接为xxx.html。 于是决定小改wordpress生成sitemap插件google-sitemap-generator。 // plugin/google-sitemap-generator/sitemap-builder.php foreach($posts AS $post) { //Fill the cache with our DB result. Since it's incomplete (no text-content for example), we will clean it later. //This is required since the permalink function will do a query for every post otherwise. //wp_cache_add($post->ID, $post, 'posts'); //Full URL to the Read more…

Did you mean to use React.forwardRef()?搞懂react的createRef和forwardRef

最近在使用react过程中发现在使用ref时的一些场景,自己初步感觉react的ref没有vue那么强大。 现在我就简单看下怎么使用ref? createRef 我们直接看源码 // node_modules/react/umd/react.development.js // an immutable object with a single mutable value function createRef() { var refObject = { current: null }; { Object.seal(refObject); } return refObject; } 其实createRef也没做什么,就是返回了一个对象{ current: null},但是在返回值之前进行了Object.seal操作 Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。 我们简单测试下 createRef使用场景 我们一般是在构造函数里面先新建个空的ref,为了方便在调试工具中查看,我们把ref放到state里面。 比如 import AsideMenu from './Menu.jsx'; export default class Layout extends React.Component { Read more…