iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React怎么转微信小程序
  • 131
分享到

React怎么转微信小程序

2023-06-26 08:06:15 131人浏览 八月长安
摘要

本篇内容主要讲解“React怎么转微信小程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么转微信小程序”吧!  微信小程序是面向配置对象编程,不暴露Page,App,Compone

本篇内容主要讲解“React怎么转微信小程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么转微信小程序”吧!

  微信小程序是面向配置对象编程,不暴露Page,App,Component等核心对象的原型,只提供三个工厂方法,因此无法实现继承。App,Page,Component所在的js的依赖处理也很弱智,你需要声明在同一目录下的JSON文件中。

  比如说

  Component({

  properties: {},

  data: {},

  onClick: function(){}

  })

  properties与data都是同一个东西,properties只是用来定义data中的数据的默认值与类型,相当于React的defaultProps与propTypes。如何转换呢?

  import {Component} fORM "./wechat"

  Class AAA extends Component{

  constructor(props){

  super(props);

  this.state = {}

  }

  static propTypes = {}

  static defaultProps = {}

  onClick(){}

  render(){}

  }

  export AAA;

  首先我们要提供一个wechat.js文件,里面提供Component, Page, App 这几个基类,现在只是空实现,但已经足够了,保证它在调试不会出错。我们要的是`Class AAA extends Component`这个语句的内容。学了babel,对JS语法更加熟悉了。这个语句在babel6中称为ClassExpression,到babel7中又叫ClassDeclaration。babel有一个叫"babel-traverse"的包,可以将我们的代码的AST,然后根据语法的成分进行转换(详见这文章 https://yq.aliyun.com/articles/62671)。ClassDeclaration的参数为一个叫path的对象,我们通过 path.node.superClass.name 就能拿到Component这个字样。如果我们的类定义是下面的这样,path.node.superClass.name 则为App。

  Class AAA extends App{

  constructor(props){

  super(props);

  this.state = {}

  }

  }

  App, Page, Component对应的json差异很大,拿到这个可以方便我们区别对待。

  然后我们继续定义一个ImportDeclaration处理器,将import语句去掉。

  定义ExportDefaultDeclaration与ExportNamedDeclaration处理器,将export语句去掉。

  到这里我不得不展示一下我的转码器的全貌了。我是通过rollup得到所有模块的路径与文件内容,然后通过babel进行转译。babel转换是通过babel.transform。babel本来就有许多叫babel-plugin-transform-xxx的插件,它是专门处理那些es5无法识别的新语法。我们需要在这后面加上一个新插件叫miniappPlugin

  // Https://GitHub.com/RubyLouvre/anu/blob/master/packages/render/miniapp/translator/transform.js

  const syntaxClassProperties = require("babel-plugin-syntax-class-properties")

  const babel = require('babel-core')

  const visitor = require("./visitor");

  var result = babel.transform(code, {

  babelrc: false,

  plugins: [

  'syntax-jsx',

  // "transform-react-jsx",

  'transform-decorators-legacy',

  'transform-object-rest-spread',

  miniappPlugin,

  ]

  })

  function miniappPlugin(api) {

  return {

  inherits: syntaxClassProperties,

  visitor: visitor

  };

  }

  miniappPlugin的结构异常简单,它继承一个叫syntaxClassProperties的插件,这插件原来用来解析es6 class的属性的,因为我们的目标也是抽取React类中的defaultProps, propsTypes静态属性。

  visitor的结构很简单,就是各种JS语法的描述。

  const t = require("babel-types");

  module.exports = {

  ClassDeclaration: 抽取父类的名字与转换构造器,

  ClassExpression: 抽取父类的名字与转换构造器,

  ImportDeclaration(path) {

  path.remove() //移除import语句,小程序会自动在外面包一层,变成AMD模块

  },

  ExportDefaultDeclaration(path){

  path.remove() //AMD不认识export语句,要删掉,或转换成module.exports

  },

  ExportNamedDeclaration(path){

  path.remove() //AMD不认识export语句,要删掉,或转换成module.exports

  }

  }

  我再介绍一下visitor的处理器是怎么用的,处理器其实会执行两次。我们的AST树每个节点会被执行两次,如果学过DFS的同学会明白,第一次访问后,做些处理,然后进行它内部的节点,处理后再访问一次。于是visitor也可以这样定义。

  ClassDeclaration:{

  enter(path){},

  exit(path){}

  }

  如果以函数形式定义,那么它只是作为enter来用。

  AST会从上到下执行,我们先拿到类名的名字与父类的名字,我们定义一个modules的对象,保存信息。

  enter(path) {

  let className = path.node.superClass ? path.node.superClass.name : "";

  let match = className.match(/\.?(App|Page|Component)/);

  if (match) {

  //获取类的组件类型与名字

  var componentType = match[1];

  if (componentType === "Component") {

  modules.componentName = path.node.id.name;

  }

  modules.componentType = componentType;

  }

  },

  我们在第二次访问这个类定义时,要将类定义转换为函数调用。即

  Class AAA extends Component ---> Component({})

  实现如下,将原来的类删掉(因此才在exit时执行),然后新建一个函数调用语句。我们可以通过babel-types这个句实现。具体看这里。比如说:

  const call = t.expressionStatement(

  t.callExpression(t.identifier("Component"), [ t.objectExpression([])])

  );

  path.replaceWith(call);

  就能产生如下代码,将我们的类定义从原位置替换掉。

  Component({})

  但我们不能是一个空对象啊,因此我们需要收集它的方法。

  我们需要在visitors对象添加一个ClaSSMethod处理器,收集原来类的方法。类的方法与对象的方法不一样,对象的方法叫成员表达式,需要转换一下。我们首先弄一个数组,用来放东西。

  var methods = []

  module.exports= {

  ClassMethod: {

  enter(path){

  var methodName = path.node.key.name

  var method = t.ObjectProperty(

  t.identifier(methodName),

  t.functionExpression(

  null,

  path.node.params,

  path.node.body,

  path.node.generator,

  path.node.async

  )

  );

  methods.push(method)

  }

  }

  然后我们在ClassDeclaration或ClassExpression的处理器的exit方法中改成:

  const call = t.expressionStatement(

  t.callExpression(t.identifier("Component"), [ t.objectExpression(methods)])

  );

  path.replaceWith(call);

  于是函数定义就变成

  Component({

  constructor:function(){},

  render:function(){},

  onClick: function(){}

  })

  到这里,我们开始另一个问题了。小程序虽然是抄React,但又想别出心裁,于是一些属性与方法是不一样的。比如说data对应state, setData对应setState,早期的版本还有forceUpdate之类的。data对应一个对象,你可以有千奇百怪的写法。

  this.state ={ a: 1}

  this["state"] = {b: 1};

  this.state = {}

  this.state.aa = 1

  你想hold住这么多奇怪的写法是很困难的,因此我们可以对constructor方法做些处理,然后其他方法做些约束,来减少转换的成本。什么处理constructor呢,我们可以定义一个onInit方法,专门劫持constructor方法,将this.state变成this.data。

  function onInit(config){

  if(config.hasOwnProperty("constructor")){

  config.constructor.call(config);

  }

  config.data = config.state|| {};

  delete config.state

  return config;

  }

  Component(onInit({

  constructor:function(){},

  render:function(){},

  onClick: function(){}

  }))

  具体实现参这里,本文就不贴上来了。

  RubyLouvre/anu

  那this.setState怎么转换成this.setData呢。这是一个函数调用,语法上称之为**CallExpression**。我们在visitors上定义同名的处理器。

  CallExpression(path) {

  var callee = path.node.callee || Object;

  if ( modules.componentType === "Component" ) {

  var property = callee.property;

  if (property && property.name === "setState") {

  property.name = "setData";

  }

  }

  },

  至少,将React类定义转换成Component({})调用方式 成功了。剩下就是将import语句处理一下,因为要小程序中,如果这个组件引用了其他组件,需要在其json中添加useComponens对象,将这些组件名及链接写上去。换言之,小程序太懒了,处处都要手动。有了React转码器,这些事可以省掉。

  其次是render方法的转换,怎么变成一个wxml文件呢,`{}单花括号的内容要转换成`"{{}}"`双引号+双花括号 ,wx:if, wx:for的模拟等等,且听下回分解。

到此,相信大家对“React怎么转微信小程序”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: React怎么转微信小程序

本文链接: https://www.lsjlt.com/news/308317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React怎么转微信小程序
    本篇内容主要讲解“React怎么转微信小程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么转微信小程序”吧!  微信小程序是面向配置对象编程,不暴露Page,App,Compone...
    99+
    2023-06-26
  • 微信小程序ES6怎么转ES5
    这篇文章主要介绍了微信小程序ES6怎么转ES5的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序ES6怎么转ES5文章都会有所收获,下面我们一起来看看吧。项目页卡主要有三大功能显示当前项目细节包括图标、A...
    99+
    2023-06-26
  • 微信小程序跳转H5、小程序、App
    日常开发业务中会遇到微信小程序与H5、其他小程序、App之间的相互跳转,客户对引流用户非常在意。此处粗浅的介绍了微信小程序跳转H5、小程序、App的实现思路。 1、跳转H5 使用微信开放组件 web-...
    99+
    2023-09-24
    小程序 微信小程序 微信
  • H5跳转微信小程序,通过获取URL Scheme,实现短信跳转小程序,微信跳转小程序,邮件跳转小程序,外部链接跳转小程序
    H5链接跳转小程序有2种方式: 第一种:通过微信官方提供的标签wx-open-launch-weapp,打开小程序 第二种:通过获取URL Scheme实现链接跳转小程序 一、wx-open...
    99+
    2023-10-21
    微信小程序 小程序 微信
  • 微信小程序页面跳转方式+跳转小程序
    一. 跳转页面方法 1.跳转到 tabBar 页面 wx.switchTab({ url: '/index'}) 2.跳转到其他页面(非tabBar页) //redirectTo方法(会关闭当前页面...
    99+
    2023-09-28
    小程序 微信小程序
  • 跳转微信小程序和支付宝小程序
    跳转微信小程序和支付宝小程序 1. 微信小程序 参考链接 获取微信小程序 URL Scheme 1.1 获取小程序连接 这里需要获取长期有效的 Scheme,方式如下: 联系小程序开发者其他渠道 示例 小程序 Scheme : 测试地址,可...
    99+
    2023-08-16
    微信小程序 小程序
  • php版 短信跳转微信小程序
    实现这功能首先,小程序端添加业务域名  php代码 ...
    99+
    2023-10-10
    php 微信小程序 开发语言
  • 微信小程序怎么用
    这篇文章给大家分享的是有关微信小程序怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序要去哪里找?又该怎么用?秘密全在这里微信小程序正式发布 看完你也会玩小程序!&n...
    99+
    2022-10-19
  • 微信小程序怎么实现抽奖大转盘
    这篇“微信小程序怎么实现抽奖大转盘”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序怎么实现抽奖大转盘”文章吧。界面就...
    99+
    2023-06-26
  • 微信小程序怎么优化
    这篇文章主要介绍了微信小程序怎么优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。页面跳转优先采用navigator组件小程序提供了两种页面路由方式:a. navigator...
    99+
    2023-06-20
  • 微信小程序videoContext怎么用
    这篇文章主要介绍了微信小程序videoContext怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序videoContext怎么用文章都会有所收获,下面我们一起来看看吧。wx.createVide...
    99+
    2023-06-26
  • 怎么注销微信小程序
    注销微信小程序的方法:1.登录小程序后台;2.暂停小程序;3.注销小程序帐号;4.验证主体真实性,对公账户打款验证;5.等待账号注销结果;具体步骤如下:首先,在浏览器中登录微信小程序后台;点击左侧菜单栏“设置”选项,在原始ID后面有一个账户...
    99+
    2022-10-05
  • 微信小程序怎么创建
    1.进入微信公众平台,点击立即注册;在注册选项中,选择小程序;在小程序注册界面,填写邮箱、设置密码,并进行邮箱验证;验证通过后,根据需求选择注册小程序的类型;最后,进入小程序开发者工具,上传源代码,提交审核,即可。...
    99+
    2022-10-06
  • 怎么发布微信小程序
    这篇文章主要介绍“怎么发布微信小程序”,在日常操作中,相信很多人在怎么发布微信小程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么发布微信小程序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!审批通过以...
    99+
    2023-06-19
  • 微信小程序怎么浮窗
    微信小程序浮窗的方法:打开微信小程序。进入小程序界面后,点击右上方“···”的图标。在弹出来的对话框中点击“浮窗”的选项。点击后,可以看到微信界面的右侧就会显示浮窗。...
    99+
    2022-10-06
  • 微信小程序怎么开通
    开通微信小程序的操作步骤:访问微信公众平台,点击右上角“立即注册”。选择注册的帐号类型为“小程序”。按照要求去填写帐号信息,完成注册。利用第三方工具开发及搭建小程序,最后发布小程序即可。...
    99+
    2022-10-08
  • 微信小程序怎么删除
    删除微信小程序的操作步骤:登录需要删除小程序的微信APP。点击底部“发现”菜单。找到“小程序”功能选项,打开进入小程序页面。找到需要删除的小程序,长按小程序。在弹出的对话框中,选择“删除”即可。...
    99+
    2022-10-21
  • 微信小程序怎么制作
    这篇文章主要介绍了微信小程序怎么制作的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么制作文章都会有所收获,下面我们一起来看看吧。微信小程序制作步骤一:设计 小程序制作所涉及到的设计关于页面的排版和美...
    99+
    2023-06-27
  • 微信小程序APIsetTextAlign怎么用
    本文小编为大家详细介绍“微信小程序APIsetTextAlign怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序APIsetTextAlign怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。c...
    99+
    2023-06-26
  • 微信小程序怎么盈利
    这篇文章主要介绍了微信小程序怎么盈利的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么盈利文章都会有所收获,下面我们一起来看看吧。中小型企业,没有足够的资金去开发APP的,可以通过微信小程序来实现推广...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作