跨框架解决方案-Mitosis【项目结构、组件、样式、状态】

Mitosis项目结构

以下是Mitosis的项目结构:

  • src/ 包含Mitosis的源代码
  • output/ 包含项目每个目标的输出,output中存在.lite和.tsx文件,这是可读的Mitosis组件,可以参考这些文件让我们更方便的进行调试。因为实际输出的js被简化了很难阅读。
  • mitosis.config.js 包含一些通用的配置和每个目标的配置,对Mitosis进行构建的时候使用。
  • overrides/ 包含一个模仿src/目录的文件夹,并且将完全替换具有相同名称的文件夹,比如我们定义overrides/react-native/src/functions/is-react-native.ts,它将在
    output/react-native/src/functions/is-react-native.js. 中覆盖
    src/functions/is-react-native.ts

Mitosis组件

Mitosis受许多现代框架的影响,Mitosis组件看起来像React组件,使用类似React的hooks,拥有类似Vue的可变的响应式状态,使用类似Solid那样的静态形式的JSX,像Slvelte那样可以进行编译,并使用Angular那样简单的规范结构。
概括就是:React Hooks + Vue state + JSX + 可编译 + Angular 规范
Mitosis组件示例:

import { For, Show, useStore } from '@builder.io/mitosis';

export default function MyComponent(props) {
  const state = useStore({
    newItemName: 'New item',
    list: ['hello', 'world'],
    addItem() {
      state.list = [...state.list, state.newItemName];
    },
  });

  return (
    <div>
      <Show when={props.showInput}>
        <input
          value={state.newItemName}
          onChange={(event) => (state.newItemName = event.target.value)}
        />
      </Show>
      <div css={{ padding: '10px' }}>
        <button onClick={() => state.addItem()}>Add list item</button>
        <div>
          <For each={state.list}>{(item) => <div>{item}</div>}</For>
        </div>
      </div>
    </div>
  );
}

Mitosis和大多数前端框架一样是组件驱动的。每个Mitosis组件应该在它自己的文件中单独默认导出。它们是返回JSX结构的简单函数。

样式

样式是通过dom元素和组件的css props控制的。可以设置css属性对象或者有效的css 属性字符串。例如:

export default function CSSExample() {
  return <div css={{ marginTop: '10px', color: 'red' }} />;
}

还可以将媒体查询作为键,将样式对象作为值。

export default function ResponsiveExample() {
  return (
    <div
      css={{
        marginTop: '10px',
        '@media (max-width: 500px)': {
          marginTop: '0px',
        },
      }}
    />
  );
}

Mitosis更希望你使用class,同样也支持className,如果两者在同一组件中使用,最好合并起来,使用class。

State

state由useStore钩子提供,目前,这个值的名称必须是state,如下所示:

export default function MyComponent() {
  const state = useStore({
    name: 'Steve',
  });

  return (
    <div>
      <h2>Hello, {state.name}</h2>
      <input onInput={(event) => (state.name = event.target.value)} value={state.name} />
    </div>
  );
}

如果初始状态值是计算出来的,无论是参数props中获取的还是方法的返回值,都不能直接使用,这种情况需要使用getter方法:

import { kebabCase } from 'lodash';

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

  return (
    <div>
      <h2>Hello, {state.name}</h2>
      <input onInput={(event) => (state.name = event.target.value)} value={state.name} />
    </div>
  );
}

当状态值发生变化时组件会自动更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的功能是从UCI机器学习数据库中读取乳腺癌数据集并进行训练和验证。 - `loc<-"http://archive.ics.uci.edu/ml/machine-learning-databases/"`:将数据集所在的基础地址存储在`loc`变量中。 - `ds<-"breast-cancer-wisconsin/breast-cancer-wisconsin.data"`:将数据集所在的相对地址存储在`ds`变量中。 - `url<-paste(loc,ds,sep="")`:将`loc`和`ds`合并成完整的URL,并存储在`url`变量中。 - `breast<-read.table(url,sep=",",header=FALSE, na.strings="?")`:使用`read.table()`函数读取`url`中的数据集。参数`sep`指定分隔符为逗号,`header`指定数据集没有标题行,`na.strings`指定缺失值为问号"?"。读取的数据集存储在`breast`变量中。 - `names(breast)<-c("ID","clumpThickness","sizeUniformity","shapeUniformity", "maginalAdhesion","singleepithelialcellsize","barenuclei", "blandchromation","normanucleoli","mitosis","class")`:给数据集的列(变量)命名。 - `df<-breast[-1]`:将数据集的第一列ID删除,存储在`df`变量中。 - `df$class<-factor(df$class,levels=c(2,4),labels=c("benign","malignant"))`:将数据集中的`class`变量(诊断结果)转换为因子型变量,并使用`levels`和`labels`参数将2转换为"benign",将4转换为"malignant"。 - `set.seed(1234)`:使用`set.seed()`函数设置随机数种子,以便结果可复现。 - `train<-sample(nrow(df),0.7*nrow(df))`:使用`sample()`函数生成一个随机样本序列,从`df`中选择70%的行,并存储在`train`变量中。 - `df.train<-df[train,]`:将`train`中的行作为训练集,从`df`中选择对应的行,并存储在`df.train`变量中。 - `df.vaalidate<-df[-train,]`:将不在`train`中的行作为验证集,从`df`中选择对应的行,并存储在`df.vaalidate`变量中。 - `table(df.train$class)`和`table(df.vaalidate$class)`:使用`table()`函数统计训练集和验证集中各类别的样本数量,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值