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...

相关推荐
徐同保3 小时前
react useState ts定义类型
前端·react.js·前端框架
ZKNOW甄知科技4 小时前
客户案例 | 派克新材x甄知科技,构建全场景智能IT运维体系
大数据·运维·人工智能·科技·低代码·微服务·制造
linweidong6 小时前
让低端机也能飞:Canvas/WebGL/Viz 分层、降级渲染与数据抽样策略
前端框架·webgl·canvas·前端动画·前端面经·css渲染·动画优化
醉方休6 小时前
React 官方推荐使用 Vite
前端·react.js·前端框架
浪裡遊10 小时前
MUI组件库与主题系统全面指南
开发语言·前端·javascript·vue.js·react.js·前端框架·node.js
浪裡遊13 小时前
React开发模式解析:JSX语法与生命周期管理
前端·javascript·react.js·前端框架·ecmascript
爱因斯坦乐17 小时前
【vue】I18N国际化管理系统
前端·javascript·vue.js·笔记·前端框架
蒙奇·D·路飞-1 天前
2025-10-16-TH 开源框架JeecgBoot Pro搭建流程
低代码
文心快码BaiduComate1 天前
基于YOLOv8的动漫人脸角色识别系统:Comate完成前端开发
前端·后端·前端框架
ら陈佚晨1 天前
React 18 的核心设计理念:并发渲染
前端·javascript·react.js·前端框架·fiber