Mitosis开发技巧和注意事项

我们采用了ESLint,这样当你遇到限制时,会看到警告。这些lint规则是一个很好的文档来源,请先确保你读了这些规则

用与状态属性有相同名字的变/常量容易有误导性

比如,如果错误输入为:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    foo: 'bar',

    doSomething() {
      const foo = state.foo;
    },
  });
}

错误输出为:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  const [foo, setFoo] = useState(() => 'bar');
  function doSomething() {
    const foo = foo;
  }

  return <></>;
}

修改 - 用不同的名字命名变/常量

正确输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    foo: 'bar',

    doSomething() {
      const foo_ = state.foo;
    },
  });
}

正确输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  const [foo, setFoo] = useState(() => 'bar');
  function doSomething() {
    const foo_ = foo;
  }

  return <></>;
}

异步函数不能被定义在"state"中

错误输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    async doSomethingAsync(event) {
      //  ^^^^^^^^^^^^^^^^^^^^^^^^^
      //  Fails to parse this line
      return;
    },
  });
}

修改 - a.在context中使用promise,或者b.立即调用异步函数

正确输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    doSomethingAsync(event) {
      void (async function () {
        const response = await fetch(); /* ... */
      })();
    },
  });
}

正确输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  function doSomethingAsync(event) {
    void (async function () {
      const response = await fetch();
    })();
  }

  return <></>;
}

函数不能通过state引用传到JSX组件中作为callback

错误输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    myCallback(event) {
      // do something
    },
  });

  return <input onClick={state.myCallback} />;
}

错误输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  function myCallback(event) {
    // do something
  }

  return (
    <>
      <input
        onClick={(event) => {
          myCallback; // mycallback不会执行
        }}
      />
    </>
  );
}

修改 - 在callback中定义匿名函数

正确输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({
    myCallback(event) {
      // do something
    },
  });

  return <input onClick={(event) => state.myCallback(event)} />;
}

正确输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  function myCallback(event) {
    // do something
  }

  return (
    <>
      <input
        onClick={(event) => {
          myCallback(event);
        }}
      />
    </>
  );
}

不能把组件传进来的props里的参数传给"state"

当在useState中引用props时,JSX解析器会报错。

错误输入:

js 复制代码
export default function MyComponent(props) {
  const state = useStore({ text: props.text });
  //                             ^^^^^^^^^^
  //                             Could not JSON5 parse object
}

修改 - 使用onMount

正确输入:

js 复制代码
export default function MyComponent(props) {
  const state = useStore({ text: null });

  onMount(() => {
    state.text = props.text;
  });
}

正确输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  const [text, setText] = useState(() => null);

  useEffect(() => {
    setText(props.text);
  }, []);

  return <></>;
}

不能把函数的输出赋值给"state"

如果某个state值不是一个合法的JSON对象,JSX解析器会报错。 如果初始状态值是一个需要被计算出来的值(无论是否基于props或某些其他函数的输出),你不能直接在useStore里写,你需要使用getter方法。

错误输入:

js 复制代码
import { kebabCase } from 'lodash';

export default function MyComponent(props) {
  const state = useStore({
    name: kebabCase('Steve'),
    //    ^^^^^^^^^
    //    Could not JSON5 parse object
  });

  return (
    <div>
      <h2>Hello, {state.name}</h2>
    </div>
  );
}

修改 - 用getter方法

正确输入:

js 复制代码
import { kebabCase } from 'lodash';

export default function MyComponent(props) {
  const state = useStore({
    get name() {
      return kebabCase('Steve');
    },
  });

  return (
    <div>
      <h2>Hello, {state.name}</h2>
    </div>
  );
}

正确输出:

js 复制代码
import { kebabCase } from 'lodash';

export default function MyComponent(props) {
  function name() {
    return kebabCase('Steve');
  }

  return (
    <div>
      <h2>
        Hello,
        {name()}
      </h2>
    </div>
  );
}

不能为state做解构赋值

目前不支持这样做,编译器会忽略这部分代码。

错误输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({ foo: '1' });

  onMount(() => {
    const { foo } = state;
  });
}

错误输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  const [foo, setFoo] = useState(() => '1');

  useEffect(() => {
    const { foo } = state;
  }, []);

  return <></>;
}

修改 - 用标准方式赋值

正确输入:

js 复制代码
export default function MyComponent() {
  const state = useStore({ foo: '1' });

  onMount(() => {
    const foo = state.foo;
  });
}

正确输出:

js 复制代码
import { useState } from 'react';

export default function MyComponent(props) {
  const [foo, setFoo] = useState(() => '1');

  useEffect(() => {
    const foo = foo;
  }, []);

  return <></>;
}

不能通过结构为组件参数设置默认值

目前不支持这样做,编译器会忽略这部分代码。

错误输入:

js 复制代码
export default function MyComponent({ color = 'blue' }) {
  return <div>{color}</div>;
}

错误输出:

js 复制代码
export default function MyComponent(props) {
  return <div>{color}</div>;
}

修改 - 定义局部变量

正确输入:

js 复制代码
const DEFAULT_VALUES = {
  color: 'blue',
};
export default function MyComponent(props) {
  return <div>{props.color || DEFAULT_VALUES.color}</div>;
}

正确输出:

js 复制代码
const DEFAULT_VALUES = {
  color: 'blue',
};
export default function MyComponent(props) {
  return <div>{props.color || DEFAULT_VALUES.color}</div>;
}

不能用...rest解构

错误输入:

js 复制代码
export default function MyComponent({ children, ...rest }) {
  return <div {...rest}>{children}</div>;
}

错误输出:

js 复制代码
export default function MyComponent(props) {
  return <div {...rest}>{props.children}</div>;
}

因此我们需要清楚每一个输入参数。

参考

github.com/BuilderIO/m...

相关推荐
jonyleek9 小时前
JVS-Logic 实践指南:基于私有化与柔性配置的企业级逻辑引擎落地方法
人工智能·低代码·私有化部署·企业集成·逻辑引擎·流程编排·jvs
2601_9539880712 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·后端·物联网·tcp/ip·数学建模·前端框架
console.log('npc')13 小时前
React 19 + Vite 企业级前端项目:从零搭建到规范交付
前端·react.js·前端框架
光影少年13 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
我命由我123451 天前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
皮皮虾❀1 天前
典铭云赛低代码+AI智能体快速落地方法论:从“售前写方案、交付做开发各管一段”到“场景发现即交付、需求到上线一周”的完整技术方案
人工智能·低代码
懒人wsh1 天前
axios 封装那点破事:401 无感刷新踩过的坑
前端框架
阿懂在掘金1 天前
同一份弹窗我重构了三次:从 v-model 地狱到路由式调用,终于治好了模板臃肿
前端·vue.js·前端框架
jonyleek1 天前
JVS-Rules 实践指南:三步实现风控与营销规则的自主配置(附可操作闭环)
低代码·系统集成·决策系统·风控系统·合规审计·jvs-rules·jvs规则引擎
xexpertS1 天前
前端工程转型实践:从 Ember 迁移到 React,提升构建速度与研发效能
前端·react.js·前端框架