登录  /  注册
博主信息
博文 27
粉丝 0
评论 0
访问量 24707
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
JS基本语法9-模块与模块实战
茂林
原创
135人浏览过

一.模块简介

  1. 模块就是一个JS文档
  2. 模块有自己的作用域(全局,函数,块,模块)
  3. 模块人成员,默认全部私有,只有导出后才可以被外部使用
  4. 模块导出的成员,默认全部是常量,外部不能更新

二.模块成员导出

  1. 逐个导出:export
  2. 批量导出:export{...}
  3. 别名导出:export{ as }
  4. 默认导出:export default
  5. 混全导出:export{ as default }

注意:一个模块仅允许一个export default

三.模块成员导入

  1. 同名导入:import {...} from
  2. 别名导入:import { as } from
  3. 整体导入:import * as obj from
  4. 默认导入:import obj from

注意:import 具有只读提升二大特征

=======================

四.模块选项卡-实战

  1. <title>选项卡-模块</title>
  2. <style>
  3. /* 隐藏类 */
  4. .hidden {
  5. display: none;
  6. }
  7. /* 显示类 */
  8. .active {
  9. display: block;
  10. }
  11. /* 激活类 */
  12. .box > .type > *.active,
  13. .content > *.active {
  14. background-color: lightgreen;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="box">
  20. <!-- 1.栏目组 -->
  21. <div class="type" style="display: flex"></div>
  22. <!-- 2.内容组 -->
  23. <div class="content"></div>
  24. </div>
  25. <script type="module">
  26. //导入模块
  27. import { createTab, setBtnStatue, setContentStatus } from "./1.js";
  28. // 1.读取栏目和内容的元素
  29. const type = document.querySelector(".type");
  30. const content = document.querySelector(".content");
  31. //2.当页面加载成功,交自动初始化选项卡
  32. window.onload = createTab(type, content);
  33. //3.点击栏目时自动切换内容
  34. type.onclick = (ev) => {
  35. //事件委托,将按钮上的点击事件全部由父级.type代理完成
  36. //ev.currentTarget:事件的绑定者(div.type)
  37. //ev.target:事件触发者(button)
  38. // console.log(ev.target);
  39. // console.log(ev.currentTarget);
  40. // console.log(this);
  41. // 2.设置栏目高亮
  42. setBtnStatue(ev);
  43. setContentStatus(ev, ev.target);
  44. };
  45. </script>
  46. </body>
  1. //栏目
  2. const cates = [
  3. { id: 1, cname: "国际新闻" },
  4. { id: 2, cname: "中国新闻" },
  5. { id: 3, cname: "本地新闻" },
  6. ];
  7. //与栏目对应的内容
  8. //内容必须与栏目的id一一对应
  9. const details = [
  10. {
  11. key: 1,
  12. cid: 1,
  13. content: [
  14. {
  15. title: "俄罗斯宣布从赫尔松部分地区撤军",
  16. url: "https://news.ifeng.com/c/8KoK54urn1k",
  17. },
  18. {
  19. title: "俄罗斯宣布从赫尔松部分地区撤军",
  20. url: "https://news.ifeng.com/c/8KoK54urn1k",
  21. },
  22. {
  23. title: "俄罗斯宣布从赫尔松部分地区撤军",
  24. url: "https://news.ifeng.com/c/8KoK54urn1k",
  25. },
  26. ],
  27. },
  28. {
  29. key: 2,
  30. cid: 2,
  31. content: [
  32. {
  33. title: "空战隐身无人僚机亮相!",
  34. url: "https://news.ifeng.com/c/8KoeDFJXF1b",
  35. },
  36. {
  37. title: "空战隐身无人僚机亮相!",
  38. url: "https://news.ifeng.com/c/8KoeDFJXF1b",
  39. },
  40. {
  41. title: "空战隐身无人僚机亮相!",
  42. url: "https://news.ifeng.com/c/8KoeDFJXF1b",
  43. },
  44. ],
  45. },
  46. {
  47. key: 3,
  48. cid: 3,
  49. content: [
  50. {
  51. title: "“安康码”上新!家庭成员核酸情况查询更便捷",
  52. url: "https://ah.ifeng.com/c/8KkGUDhAZNZ",
  53. },
  54. {
  55. title: "“安康码”上新!家庭成员核酸情况查询更便捷",
  56. url: "https://ah.ifeng.com/c/8KkGUDhAZNZ",
  57. },
  58. {
  59. title: "“安康码”上新!家庭成员核酸情况查询更便捷军",
  60. url: "https://ah.ifeng.com/c/8KkGUDhAZNZ",
  61. },
  62. ],
  63. },
  64. ];
  65. //1.自动创建栏目和对应的内容
  66. function createTab(type, content) {
  67. //1.1 生成栏目
  68. for (let i = 0; i < cates.length; i++) {
  69. const btn = document.createElement("button");
  70. btn.textContent = cates[i].cname;
  71. //添加自定义数据属性 "data-key" 用于和指定的数据内容进行绑定
  72. btn.dataset.key = cates[i].id;
  73. // console.log(cates[i].id);
  74. if (i === 0) {
  75. btn.classList.add("active");
  76. }
  77. type.append(btn);
  78. }
  79. // console.log(details.length);
  80. // 1.2 生成内容
  81. for (let i = 0; i < details.length; i++) {
  82. let ul = document.createElement("ul");
  83. //与栏目组的data-key 进行绑定
  84. ul.dataset.key = details[i].cid;
  85. //全部内容,刚加载时,默认全是隐藏的,哪个需要显示由默认分类标签决定
  86. ul.classList.add(i === 0 ? "active" : "hidden");
  87. //二级循环,把与列表对应的内容全部渲染出来
  88. for (let j = 0; j < details[i].content.length; j++) {
  89. let li = document.createElement("li");
  90. let a = document.createElement("a");
  91. a.textContent = details[i].content[j].title;
  92. a.href = details[i].content[j].url;
  93. li.append(a);
  94. ul.append(li);
  95. content.append(ul);
  96. }
  97. }
  98. }
  99. //2.设置当前栏目高亮
  100. function setBtnStatue(ev) {
  101. //(1)先把按钮上的高亮状态全取消,由于不知道你当前选的是哪个,所以遍历一下
  102. // ev.currentTaget:dispatchEvent.type 父级
  103. // console.log(ev.currentTarget.children);
  104. // console.log([...ev.currentTarget.children]);
  105. // console.log(ev.target);
  106. [...ev.currentTarget.children].forEach((btn) =>
  107. btn.classList.remove("active")
  108. );
  109. //(2)设置高亮
  110. ev.target.classList.add("active");
  111. }
  112. // 3. 设置与栏目对应的内容的激活状态
  113. function setContentStatus(ev, currentBtn) {
  114. console.log(ev.target); //事件触发者 btn.onclick 子级
  115. // console.log(ev.currentTarget); //事件绑定者 div.type父级
  116. const list = document.querySelectorAll(".content>ul");
  117. // console.log(list);
  118. // list.forEach((ul) => console.log(ul));
  119. list.forEach((ul) => ul.classList.replace("active", "hidden"));
  120. // console.log(currentBtn);
  121. //找到与栏目id对应的内容
  122. const currList = [...list].find(
  123. (ul) => ul.dataset.key === currentBtn.dataset.key
  124. );
  125. // console.log(conList);
  126. currList.classList.replace("hidden", "active");
  127. }
  128. //导出模块成员
  129. export { createTab, setBtnStatue, setContentStatus };



本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学