小程序triggerevent 传参_微信小程序——无限递归的层次列表

——上礼拜踩的坑

1、关于为什么不直接操作DOM对象?

因为微信小程序里没有document对象。

2、为什么坑了这多时间?

因为之前看了个过期的帖子,完美避开了解决方案。

下面进入正文,需求是在微信小程序里构造一棵文件树。

3、解决思路

定义一个自定义组件,并在这个组件里递归自己。

4、自定义组件.json文件

{"component": true,"usingComponents": {"alexTree":"path/to/component"}
}

由于组件要引用自己,所以这里定义了组件自己。

“alexTree”是组件里引用自己时用的标签名,理论上是可以自定义的,只要在wxml文件j里对应起来就好。

5、组件的property定义

  properties: {treeBody:{type: Array,value:[],observer: function (newVal, oldVal, changedPath) {}},treeConfig:{type:Object,value:{haveOpGroup:false,haveIconGroup:false,opGroup:{label:"",icon:"",onTap:function(node){console.log("opGroup tapped.");}},tapOnNode:function(node){console.log("tapOnNode");}},observer: function(newVal, oldVal, changedPath) {}},},

主要定义了两个属性,一个是数据tree-body,一个是配置tree-config。

数据结构本身当然也是递归的。tree-body是一个数组(根目录),其中的元素作为文件,一个文件可以是一个普通文件,也可以是一个目录文件,用元素的isDir属性来区分,如下:

{filename:<String>isDir:<Boolean>data:<Array>/<Object>
}

filename是文件名,当isDir为true时,data为子文件数组,当isDir为false时,data为与文件相关的自定义数据,例如文件在服务器的url等。

6、 wxml大致结构。

<view wx:for="{{treeBody}}"><!-- 这里为当前节点的构造逻辑 --><view class='treeNode' catchtap="tapOnNode" data-node='{{item}}'> <<<<<<vviieew>>>>>>>>><!-- balabala --><!-- balabala --><!-- balabala --><!-- 然后判断此节点是否展开,下面的逻辑里,如果这个节点为展开状态的目录,就递归此组件 --><!-- 注意alexTree为上面json文件里定义的 --><view class='childNodes'><alexTree wx:if="{{item.isDir && item.expand}}" tree-body="{{item.data}}" tree-config="{{treeConfig}}" data-filename="{{item.filename}}" bindnodechanged="_handleChildNodeChanged"/></view>
</view>

7、点击节点更改目录展开状态

   tapOnNode:function(e){// 点击节点时,折叠或展开结点(目录)var tmpNode = e.currentTarget.dataset.node;var filename = tmpNode.filename;var nodes = this.data.treeBody;var node = this._findNodeByName(nodes,filename);if(!node){return;}if(node.isDir){if(node.expand){delete node.expand;}else{node["expand"] = 1;}}this._refreshTree(nodes);// 调用treeConfig.tapOnNodeif(this.data.treeConfig.tapOnNode){this.data.treeConfig.tapOnNode();}},

8、另一个问题

传递给子节点的数据为深复制之后的数组,所以改变子节点的数据,不会影响到父节点的数据。当父节点目录折叠时,重新展开后,子节点的状态无法保存。

解决方案:当子节点数据改变时,抛出一个自定义事件,父节点捕捉这个事件,同时更改自己的数据。

    // 刷新树_refreshTree:function(nodes){this.setData({treeBody : nodes,});// 然后向父结点抛出一个nodeChanged事件var filename = this.dataset.filename;var myEventDetail = { filename: filename,nodes: nodes,} // detail对象,提供给事件监听函数var myEventOption = {} // 触发事件的选项this.triggerEvent('nodechanged', myEventDetail, myEventOption)},_handleChildNodeChanged:function(e){// 处理子结点抛出的nodeChanged事件var filename = e.detail.filename;var nodes = this.data.treeBody;for (var i = 0; i < nodes.length; i++) {if (nodes[i].filename == filename) {nodes[i].data = e.detail.nodes;}}this.setData({treeBody: nodes,});},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法

java ab工具如果您正在使用更高级的语言&#xff08;例如Scala或Ceylon&#xff0c;甚至JavaScript&#xff09;进行编程&#xff0c;则“嵌套函数”或“本地函数”是您非常常见的习惯用法。 例如&#xff0c;您将编写诸如fibonacci函数之类的东西&#xff1a; def f() {def …

C++ 11 深度学习(六)智能指针综述

以下三种智能指针均为类模板 1.shared_ptr 共享指针 &#xff0c;多个指针指向同一个对象&#xff0c;最后一个指针被销毁时&#xff0c;这个对象会被释放。 2.week_ptr 是辅助shared_ptr工作的 3.unique_ptr 是独占式指针&#xff0c;同一时间只能有一个指针能指向该对象…

python的仿真效果好吗_Python SimPy 仿真系列 (1)

本系列文章旨在介绍 SimPy 在工业仿真中的应用。在物流行业/工厂制造业/餐饮服务业存在大量急需优化的场景&#xff0c; 例如&#xff1a;如何最优化快递分拣人员的排班表以满足双十一突发的快递件量如何估算餐厅在用餐高峰的排队时长估算特定工序下&#xff0c;工厂生产所需要…

jax-rs jax-ws_您的JAX-RS API并非天生就等于:使用动态功能

jax-rs jax-ws这次&#xff0c;我们将讨论一些有关JAX-RS 2.0 API的内容&#xff0c;并涉及规范的一个非常有趣的方面&#xff1a; 动态功能及其实用性。 传统上&#xff0c;当配置和部署JAX-RS 2.0 API&#xff08;使用Application类&#xff0c;从servlet引导或通过RuntimeD…

10 NAT网络地址转换

广域网技术 上面聊的内容都是内网的一些配置&#xff0c;但内网终将要访问外网的&#xff0c;我们需要怎么处理呢&#xff1f;一般使用HDLC&#xff08;高级数据链路控制协议&#xff09;或者PPP&#xff08;点对点协议&#xff09;。 使用PPP安全接入Internet PPP&#xff0…

Leetcode 61. 旋转链表

原题链接 题解&#xff1a; 1.首先确定k的取值&#xff0c;可能超过链表长度&#xff0c;所有对 k%n 来确定 2.需要找到k前面的结点和最右位置的结点&#xff0c;可以使用双指针得到。 /*** Definition for singly-linked list.* struct ListNode {* int val;* Lis…

java应用性能指标_性能与可靠性:Java应用为何像F1汽车

java应用性能指标再想一想。 性能和可靠性相关吗&#xff1f; 还是这些东西相互排斥&#xff1f; 我认为是后者。 如今&#xff0c;现实是IT部门将应用程序的性能和可靠性视为同一事物&#xff0c;但这离事实还差得远。 让我们看看一级方程式车队如何管理性能和可靠性。 上赛…

tomcat ajp协议安全限制绕过漏洞_Apache Tomcat文件包含漏洞(CVE20201938)复现

一、漏洞背景2020年02月20日&#xff0c;国家信息安全漏洞共享平台(CNVD)发布了关于Apache Tomcat文件包含漏洞(CVE-2020-1938/CNVD-2020-10487)的安全公告。Tomcat作为一款免费开源轻量级的web应用服务器&#xff0c;广泛应用于并发量不是很高的场合&#xff0c;Tomact默认端口…

【H.264/AVC视频编解码技术】第三章【熵编码】

熵编码的概念 熵&#xff1a;化学与热力学概念&#xff0c;用于度量能量退化的指标。熵越高&#xff0c;物体/系统做工能力越低。 信息学中的熵&#xff1a;用于度量消息的平均信息量&#xff0c;和信息的不确定性。越是随机的&#xff0c;前后不相关的信息&#xff0c;其熵越…

mock 抛出一个异常如何终止_教你使用Mock完成单元测试

更多精彩文章请关注本人微信公众号1、什么是Mock?mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象的行为。比如说你需要调用B服务&#xff0c;可是B服务还没有开发完成&#xff0c;那么你就可以将调用B服务的那部分给Moc…

jconsole查看连接数_在JConsole和VisualVM中查看DiagnosticCommandMBean

jconsole查看连接数我已经将JConsole用作合适的通用JMX客户端已有很多年了。 该工具通常随Oracle JDK一起提供&#xff0c;并且易于使用。 在JMX交互方面&#xff0c;JConsole优于VisualVM的最大优点是JConsole带有内置的MBeans选项卡&#xff0c;而必须为VisualVM中的相同功能…

剑指 Offer 40-----50

50. 第一个只出现一次的字符 原题链接 class Solution { public:char firstUniqChar(string s) {char res ;if(!s.size()) return res;unordered_map<char, int> mmp; for(int i 0; i < s.size(); i) {mmp[s[i]] 1;}for(int i 0; i < s.size(); i){if(mmp[s…

jpa root.join_JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

jpa root.joinJava EE 7已经存在了几年&#xff0c;并且提供了一些非常有用且期待已久的功能&#xff0c;例如实体图以及对存储过程和结果映射的更好支持。 有关概述&#xff0c;请参阅Thorben Janssen的博客文章 。 但是&#xff0c;我想添加有关JPA查询语言功能的更详细的摘要…

如何知道一个域名是否存在_域名检测API实现查看一个域名在微信中是否被封

针对微信转发分享链接过程中&#xff0c;您宝贵的域名被微信检测系统过滤拦截而无法正常浏览&#xff0c;例如该网页包含诱导分享内容&#xff0c;被多人投诉等&#xff0c;又例如提示该网页已停止访问等提示。怎么查询域名在微信中是否被封了呢?以上接口可检测到域名的四种异…

LeetCode题集大全

LeetCode 01. 两数之和 LeetCode 02.两数相加 LeetCode 03. 无重复字符的最长子串 LeetCode 07. 整数反转 Leetcode 08. 字符串转换整数 (atoi) LeetCode 09. 回文数 LeetCode 13. 罗马数字转整数 LeetCode 15 二进制中1的个数 Leetcode 19. 删除链表的倒数第N个节点 Le…

qt4.8创建.pri_注意Java 8的[Pri​​mitive] Stream.iterate()中的递归

qt4.8创建.priTagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见&#xff08;请阅读问题的详细信息&#xff09;&#xff0c;而以下代码则有效&#xff1a; public static Stream<Long> longs() {return Stream.iterate(1L, i ->1L l…

量化指标公式源码_通达信指标公式源码线上阴线指标公式

工作线:(EMA(C,14)),POINTDOT,LINETHICK3,COLOR22ACDE;生命线:(MA(C,25)),LINETHICK1,COLORMAGENTA;不惑线:(MA(C,40)),COLORCYAN,LINETHICK1;姊妹线:(EMA(C,56)),POINTDOT,COLOR33CCDD,LINETHICK1;A3:EMA((((SLOPE(C,21)) * 20) C),68);A4:EMA(C,10);A5:REF(C,2);A6:((SMA((M…

归并排序 自带时间复杂度测试

//时间复杂度 O(N*log2N) //稳定程度&#xff1a; 稳定 /* 确定分界点&#xff0c;中间位置 两端排序 归并&#xff0c;合二为一 */#include<iostream> #include<time.h> using namespace std; int tmp[250001]; void Sort(int List[], int l, int r);int main()…

python 图像变化检测_python hough变换检测直线的实现方法

1 原理2 检测步骤将参数空间(ρ,θ) 量化成m*n(m为ρ的等份数&#xff0c;n为θ的等份数)个单元&#xff0c;并设置累加器矩阵&#xff0c;初始值为0&#xff1b;对图像边界上的每一个点(x,y)带入ρxcosθysinθ&#xff0c;求得每个θ对应的ρ值&#xff0c;并在ρ和θ所对应的…

ruby elixir_如何使用Elixir和Phoenix快速入门构建CRUD REST API

ruby elixir这篇文章将展示如何使用Elixir和Phoenix框架构建REST API。 重点将是为持久化到Postgres数据库后端的模型提供CRUD&#xff08;创建&#xff0c;读取&#xff0c;更新&#xff0c;删除&#xff09;端点。 我应该警告你&#xff1b; 这是一个简单的例子。 但是&#…