前端跨端复用实际(一)

咱们的页面次要由两局部组成:1.逻辑 2. 视图
如果想要跨端复用的话,那么能够从这两方面动手
个别跨端的页面有几种状况

  1. 需要一样,对应页面中的逻辑也就齐全一样,视图层只是应用的UI组件名字不一样(h5中写div,小程序中写View),须要齐全复用逻辑层
  2. 需要局部一样,对应起来就是逻辑和UI组件也是只有局部的差别,须要复用公共局部
  3. 需要齐全不一样,不同端各自写本人的,不须要复用

对应的有2种复用计划

复用逻辑,多端各自注入UI组件

将逻辑抽离到一个公共的common模块中,而后在各端的我的项目中,引入对应逻辑实现,将逻辑注入到UI组件中
具体代码见:

// model.tsxexport const model = (props: any) => {  const [name, setName] = useState(props.name)  const [age, setAge] = useState(props.age);  return {    name,    setName,    age,    setAge,    ...props  }}// mini view.tsximport { model } from './common/model'const miniView = (props: any) => {  const { name, setName, age, setAge } = model(props)  return <View onClick={setName}>    <Text>{name}</Text>    <Input value={age} onChange={setAge} />  </View>}//h5 view.tsximport { model } from './common/model'const h5View = (props: any) => {  const { name, setName, age, setAge } = model(props)  return <div onClick={setName}>    <p>{name}</p>    <Input value={age} onChange={setAge} />  </div>}

这样做的益处

  1. 逻辑复用,提高效率
  2. 在model层和UI层都能够更改逻辑和视图,针对跨端的页面需要局部一样的情景,比拟敌对,能够灵便调整。公共逻辑写在model中,差别逻辑写在View层

复用逻辑+视图

计划一的形式是将逻辑和UI拆散,那么如果咱们将这两者一起复用,那么提效会更显著,然而又会遇到以下问题

  1. 各端底层UI组件不统一
  2. 每端会存在各自的一些特定的调整
    针对问题一,底层UI组件不统一的问题,能够通过引入一个胶水层,打平各端api来实现

    // h5 rn mini引入View的形式都雷同import { View } from 'XXComponents'//在编译时批改援用门路// h5 index.tsimport { View } from 'XXComponents/h5'// rn index.tsimport { View } from 'XXComponents/rn'

    针对问题二,我的项目文件目录构造为,我的项目启动后,common文件夹以软链接的模式,copy到h5 | mini | rn中
    ├── package.json
    ├── projects
    │ ├── common
    │ ├── h5

     ├── common ├── package.json

    │ ├── mini

     ├── common ├── package.json

    │ └── rn

     ├── common ├── package.json

比方咱们有个PageA(三端都有),A中有组件B(三端都有),B组件中又有个组件C(h5,rn中有,小程序中没有),相似下图

// pageAimport B from './Components/B' // 援用common文件夹中的B组件import C from '../../Components/C' // 援用各端本人定义的C组件<PageA>  <B>    <C></C>  </B></PageA>

那么解决形式就是:
ComponentC的逻辑层写在Common文件夹中,ComponentC的View层写在各端文件夹中,h5 | rn 同时将ComponentC的逻辑引入,mini不引入逻辑代码。代码如下

// h5 componentCimport Model from '../common/modelC'const ViewC = () => {  const state = Model()  return <div>  {state.name}  </div>}// rn ComponentCimport Model from '../common/modelC'const ViewC = () => {  const state = Model()  return <View>  {state.name}  </View>}// mini ComponentCconst ViewC = () => {  return null}

这样就能够做到最大水平上复用代码,并且放弃架构的清晰可保护