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

相关推荐
小龙报1 小时前
【Coze-AI智能体平台】低代码省时高效:Coze 应用开发全流程指南
java·人工智能·python·深度学习·低代码·chatgpt·交互
2501_9272835814 小时前
荣联汇智助力天津艺虹打造“软硬一体”智慧工厂,全流程自动化引领印刷包装行业数智变革
大数据·运维·数据仓库·人工智能·低代码·自动化
We་ct20 小时前
React 性能优化精讲
前端·javascript·react.js·性能优化·前端框架·html·浏览器
光影少年1 天前
前端在页面渲染优化和组件优化经验?
前端·vue.js·react.js·前端框架
梦梦代码精1 天前
LikeShop 是怎么解决数据库瓶颈的?
java·数据库·低代码·php
盟接之桥1 天前
盟接之桥说制造:深耕长尾市场,跨越价值“临界点”
大数据·网络·安全·低代码·汽车·制造
启效云2 天前
启效云战略升级:本体论落地 AI 原生应用智能体,打造中国版 Palantir 数字基座
人工智能·低代码·软件开发·低代码开发·零码化编辑器
决斗小饼干2 天前
让“办公室政治”见鬼去吧
低代码
Codebee2 天前
Harness Engineering:AICode 的灵魂
前端·人工智能·前端框架
LT10157974442 天前
2026年低代码自动化测试平台选型指南:降低测试落地门槛
测试工具·低代码·自动化