193  
查询码:00000081
日积月累知识坑(2)- 前端
作者: 钱钟书 于 2019年12月26日 发布在分类 / 人防组 / 人防前端 下,并于 2020年08月08日 编辑
iview vue u3d unity 传参 跨域 swiper 可选链式 用户代码片段

不断积累、不断学习、不断补充.... 加油,你是最棒(胖)

vscode设置一键生成vue的template模板

(1)    代码规范文件目录结构


(2)  解决办法

(1) 设置一个代码模板片段

文件-->首选项-->用户代码片段-->vue.json

(2) 替换原有代码

代码中的 "prefix": "vue", 就是快捷键

{
	"Print to console": {
		"prefix": "vue",
		"body": [
			"<!-- $1 -->",
			"<template>",
			"<div class='$2'>$5</div>",
			"</template>",
			"",
			"<script>",
			"",
			"export default {",
			// "//这里注册组件",
			"components:{",
			"},",
			// "//这里存放数据",
			"data() {",
			"return {",
			"",
			"};",
			"},",
			// "//监听属性 类似于data概念",
			"computed: {},",
			// "//生命周期 - 挂载完成(可以访问DOM元素)",
			"mounted() {",
			"",
			"},",
			// "//beforeCreate() {}, //生命周期 - 创建之前",
			// "//beforeMount() {}, //生命周期 - 挂载之前",
			// "//beforeUpdate() {}, //生命周期 - 更新之前",
			// "//updated() {}, //生命周期 - 更新之后",
			// "//beforeDestroy() {}, //生命周期 - 销毁之前",
			// "//destroyed() {}, //生命周期 - 销毁完成",
			// "//activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发",
			// "//方法集合",
			"methods: {",
			"",
			"},",
			// "//监控data中的数据变化",
			// "watch: {}",
			"}",
			"</script>",
			"<!--声明语言,并且添加scoped-->",
			"<style lang='scss' scoped>",
			"</style>"
		],
		"description": "Log output to console"
	}
}

(3) vue文件中输入 vue ,按下 enter 快捷键


vue cli 3.0 环境中启用 optional-chaining语法功能

(1)  问题描述:增加可选链式语法报错


(2)  解决办法:

npm install --save-dev @babel/plugin-proposal-optional-chaining
在babel.config.js文件中添加

plugins:["@babel/plugin-proposal-optional-chaining"]

备注: 对于 Vue 技术栈的项目,在某些情况下,当安装 Veture 扩展插件后,后者仍然会对可选链式语法报错,即红色波浪线,解决方法是: 设置 —用户—扩展— Veture ,取消选中 Validate js/ts in <script> ,关闭 JavaScript 验证

"javascript.validate.enable": false,
"vetur.validation.script": false



swiper轮播切换条件嵌入 U3D 会刷新加载原始数据?

(1) 问题描述

最近在维护项目,接触了 swiper 。发现 2 个比较头疼的问题,第一个是基于 swiper 插件本身,第二个是在 U3D 中切换 swiper ,数据源刷新然后又加载了原始数据(纯网页浏览 Ok )。

① 以我项目为例,数据源接口返回5条数据, swiper 一屏 4 条数据,一行加载 2 条数据,第二屏应该只有 1 条数据,但实际上它加载了上一屏幕的数据。如果是数据正好占满屏幕或者不足一屏,逻辑就是正常的。

② 我点击对应swiper筛选条件,先加载了条件对应数据源,然后又加载了原始数据。


(2) 问题解决思路

① 第一个问题插件本身问题-暂不考虑解决

② 第二个问题默认先加载初始化的数据源,而不是一上来就加载u3d的传参


③ 接收到u3d的传参之后并通知 u3d 已接收成功



.自建 IView 项目访问接口存在跨域?

(1) 问题描述

最近与unity 3d配合移动端(网页加载模型),我提供数据源。他们 自己手动创建了 iview 框架项目,存在访问数据接口跨域问题。后端代码我已设置跨域问题,所以考虑从前端再次处理。

(2) 问题解决思路

① webpack proxyTable 设置跨域



② 全局注册


③ 代码示例


④ 帮助地址

帮助地址


.网页如何与 U3D 交互(基于 VUE 讲解)?

(1) 数值传递相互的,网页发送数据给U3D U3D 发送数据给网页。

(2) 公共JS方法,放置 index.html 主文件入口

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title></title>
</head>

<body>
  <noscript>
    <strong>We're sorry but iview-admin doesn't work properly without JavaScript enabled. Please enable it to continue.
    </strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->
</body>

</html>
<script>


  function Hooks() {
    return {
      initEnv: function () {
        Function.prototype.hook = function (hookFunc, context) {
          var _context = null; //函数上下文
          var _funcName = null; //函数名

          _context = context || window;
          _funcName = getFuncName(this);
          _context['realFunc_' + _funcName] = this;

          if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
            console.log("Already has been hooked,unhook first");
            return false;
          }

          function getFuncName(fn) {
            // 获取函数名
            return fn.name.replace("bound ", "");
            // var strFunc = fn.toString();
            // var _regex = /function\s+(\w+)\s*\(/;
            // var patten = strFunc.match(_regex);
            // if (patten) {
            //     return patten[1];
            // };
            // return '';
          }
          try {
            eval('_context[_funcName] = function ' + _funcName + '(){\n' +
              'var args = [];\n' +
              "args.push(_context['realFunc_" + _funcName + "'].name.replace('bound ',''));\n" +
              'args.push(Array.prototype.slice.call(arguments,0));\n' +
              'var obj = this;\n' +
              'hookFunc.apply(obj,args);\n' +
              "return _context['realFunc_" + _funcName + "'].apply(obj,args);\n" +
              '};');
            _context[_funcName].prototype.isHooked = true;
            // console.log("已勾住"+_funcName);

            return true;
          } catch (e) {
            console.log("Hook failed,check the params.");
            return false;
          }
        }
        Function.prototype.unhook = function (context) {

          var _context = null;
          var _funcName = null;
          _context = context || window;
          _funcName = this.name.replace("bound ", "");;
          if (!_context[_funcName].prototype.isHooked) {
            console.log("No function is hooked on");
            return false;
          }
          _context[_funcName] = _context['realFunc' + _funcName];
          delete _context['realFunc'];
          console.log("已释放" + _funcName);

          return true;
        }
      },
      cleanEnv: function () {
        if (Function.prototype.hasOwnProperty("hook")) {
          delete Function.prototype.hook;
        }
        if (Function.prototype.hasOwnProperty("unhook")) {
          delete Function.prototype.unhook;
        }
        return true;
      }
    };
  }
  var hook = Hooks();
  hook.initEnv();

  //业务主
  function HookEvent() {
    console.log(arguments);
    console.log(arguments[0], arguments[1]);
    HookHandler(arguments[0], arguments[1]);
  }

  function testTTTTT(param) {
    console.log("index数据");
    console.log(param);
  }



  Function.prototype.inject = function (injectFunc) {
    try {
      var _funcName = this.name.replace("bound ", "");
      var _injectFuncName = injectFunc.name.replace("bound ", "");
      window['reflectionFunc_' + _funcName] = this;

      eval('window[_injectFuncName] = function _injectFuncName(funcName, args) {\n' +
        'return eval("reflectionFunc_" + funcName + "(args);")\n' +
        '}'
      )

      return true;
    } catch (error) {
      console.log("Reflection injected function failed,check the params.");
      return false;
    }
  }

  Function.prototype.release = function () {
    try {
      var _funcName = this.name.replace("bound ", "");
      return delete window['reflectionFunc_' + _funcName];
    } catch (error) {
      console.log("Reflection release failed,Please ensure that the method has been injected");
      return false;
    }
  }

  //unity主
  function InvokeFunc() {
  }
</script>

(3) 如何向U3D传递数据?

(4) U3D如何向网页传递数据?



 推荐知识

 历史版本

修改日期 修改人 备注
2020-08-08 11:14:19[当前版本] 钱钟书 增加vue.json用户代码片段
2020-08-08 10:13:53 钱钟书 增加vue cli 3.0 环境中启用 optional-chaining语法功能
2020-01-06 11:19:18 钱钟书 v1.3
2019-12-28 11:16:17 钱钟书 v1.2

 附件

附件类型

MP4MP4 JPGJPG PNGPNG

知识分享平台 -V 4.8.7 -wcp