IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 2021SC@SDUSC amis-低代码前端框架代码分析五 -> 正文阅读

[JavaScript知识库]2021SC@SDUSC amis-低代码前端框架代码分析五

2021SC@SDUSC amis-低代码前端框架代码分析五

代码分析

log.js
这段代码,用于显示日志的组件,比如显示命令行的输出结果

const react_1 = (0, tslib_1.__importDefault)(require("node_modules/react/index"));
  const factory_1 = require("src/factory.tsx");
  const ansi_to_react_1 = (0, tslib_1.__importDefault)(require("node_modules/ansi-to-react/lib/index"));
  const api_1 = require("src/utils/api.ts");
  class Log extends react_1.default.Component {
      constructor(props) {
          super(props);
          this.isDone = false;
          this.autoScroll = false;
          this.state = {
              lastLine: '',
              logs: []
          };
          this.logRef = react_1.default.createRef();
          this.autoScroll = props.autoScroll || false;
          this.pauseOrResumeScrolling = this.pauseOrResumeScrolling.bind(this);
      }
      componentWillUnmount() {
          if (this.logRef && this.logRef.current) {
              this.logRef.current.removeEventListener('scroll', this.pauseOrResumeScrolling);
          }
      }
      componentDidMount() {
          if (this.autoScroll && this.logRef && this.logRef.current) {
              this.logRef.current.addEventListener('scroll', this.pauseOrResumeScrolling);
          }
          if (this.props.source) {
              this.loadLogs();
          }
      }
      componentDidUpdate() {
          if (this.autoScroll && this.logRef && this.logRef.current) {
              this.logRef.current.scrollTop = this.logRef.current.scrollHeight;
          }
      }

如果向上滚动就停止自动滚动,除非滚到底部


      pauseOrResumeScrolling() {
          if (this.logRef && this.logRef.current) {
              const { scrollHeight, scrollTop, offsetHeight } = this.logRef.current;
              this.autoScroll = scrollHeight - (scrollTop + offsetHeight) < 50;
          }
      }

因为这里返回结果是流式的,和普通 api 请求不一样,如果直接用 fetcher 经过 responseAdaptor 可能会导致出错,所以就直接 fetch 了

      async loadLogs() {
          const { source, data, env, translate: __, encoding } = this.props;
          const api = (0, api_1.buildApi)(source, data);
          const res = await fetch(api.url);
          if (res.status === 200) {
              const body = res.body;
              if (!body) {
                  return;
              }
              const reader = body.getReader();
              let lastline = '';
              let logs = [];
              for (;;) {
                  let { done, value } = await reader.read();
                  if (value) {
                      let text = new TextDecoder(encoding).decode(value, { stream: true });
                      // 不考虑只有 \r 换行符的情况,几乎没人用
                      const lines = text.split('\n');
                      // 如果没有换行符就只更新最后一行
                      if (lines.length === 1) {
                          lastline += lines[0];
                          this.setState({
                              lastLine: lastline
                          });
                      }
                      else {
                          // 将之前的数据补上
                          lines[0] = lastline + lines[0];
                          // 最后一个要么是空,要么是下一行的数据
                          lastline = lines.pop() || '';
                          logs = logs.concat(lines);
                          this.setState({
                              logs: logs,
                              lastLine: lastline
                          });
                      }
                  }
                  if (done) {
                      this.isDone = true;
                      return;
                  }
              }
          }
          else {
              env.notify('error', __('fetchFailed'));
          }
      }

总结

日志可以方便记录信息,方便维护。要利用好this不要弄混了

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:09:45  更:2021-12-06 15:10:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:14:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码