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

相关推荐
zqx_717 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
笑非不退1 天前
前端框架对比和选择
前端框架
布列瑟农的星空1 天前
低代码平台实践——代码编辑器
低代码
colorknight2 天前
1.2.3 HuggingFists安装说明-MacOS安装
人工智能·低代码·macos·huggingface·数据科学·ai agent
老章学编程i2 天前
Vue工程化开发
开发语言·前端·javascript·vue.js·前端框架
秃头女孩y2 天前
React基础-快速梳理
前端·react.js·前端框架
Small-K2 天前
前端框架中@路径别名原理和配置
前端·webpack·typescript·前端框架·vite
sophie旭2 天前
我要拿捏 react 系列二: React 架构设计
javascript·react.js·前端框架
大道归简2 天前
2.点位管理开发(续)及设计思路——帝可得后台管理系统
java·开发语言·spring boot·spring·前端框架
liangshanbo12152 天前
将 Intersection Observer 与自定义 React Hook 结合使用
前端·react.js·前端框架