ascoders / gaea-editor

Design websites in your browser. A smart web editor!
https://gaeajs.github.io/gaea-site/
MIT License
1.34k stars 222 forks source link

关于拓展外部antd-mobile组件作为自定义组件 #9

Closed begoat closed 7 years ago

begoat commented 7 years ago

想在自定义组件里面添加通用组件,发现了antd-mobile这个库

然后参考 这里webpack2.X 的 配置样例,了解到您是通过run-react集成webpack配置,所以下载并修改了 run-react src里面的dev.config配置文件 https://github.com/ant-design/ant-design-mobile/issues/516#issuecomment-293632772

先编译run-react然后在修改了 Gaea-editor 项目里面的 关于 run-react指定成了本地文件,然后试了很多种配置方法,一直编译的时候报错。

后来换了一种方法,新建了一个项目去先配置好webpack导入antd-mobile,然后在通过把gaea编辑器也作为一个module,import 进来配置它的componentClasses,然后还是出了一些问题。

在这里想问个 思 路,我该怎么引入呢? 或者怎么修改外部组件的配置呢?

ascoders commented 7 years ago

@begoat run-react 只是用来跑这个项目 demo 的,所以不要去修改它的配置。gaea-editor 是一个组件,真正用法是 npm i gaea-editor 然后在项目中使用它:

import Editor from "gaea-editor"

ReactDOM.render(
    <Editor />,
    document.getElementById("react-root")
)

你可以把 antd-mobile 的组件包装一层,所有 props 都透传,再定义 gaeaSetting 字段在 defaultProps 就可以了。这里是内置组件的配置,可以参考:https://github.com/ascoders/gaea-basic-components/blob/master/src/text/text.type.ts#L2

begoat commented 7 years ago

谢谢,折腾了webpack 蛮长时间终于配好了环境,现在是typescipt的 antd-mobile项目 然后饮用 Gaea成功了。

但是遇到一个新的问题,希望能得到一些帮助:

在 gaea-editor 这个项目中参考 上述的配置 改写了内置的 Icons 和 Text组件,并且在 componentClasses 这个参数去调,可以作为自定义组件去用。

Test.component.tsx

import * as React from "react"
import * as ReactDOM from "react-dom"
import { Props, State } from "./Text.type"

export default class Text extends React.Component<Props, State> {
    public static defaultProps = new Props()
    public state = new State()

    public render() {
        return (
            <p style={this.props.style}>
                {this.props.text}
            </p>
        )
    }
}

Text.type.ts

export class Props {
    public gaeaSetting = {
        key: "gaea-Text",
        name: "段落文字",
        editors: [
            "外观属性",
            {
                field: "text",
                label: "文字内容",
                type: "string"
            },
            {
                field: "style.backgroundColor",
                label: "背景颜色",
                type: "color"
            },
            {
                field: "style.color",
                label: "文字颜色",
                type: "color"
            },
            {
                field: "style.font-size",
                label: "文字大小",
                type: "number",
                data: {
                    useSlider: true,
                    sliderStep: 1,
                    inputRange: [0, 100],
                    outputRange: [0, 150]
                }
            }
        ]
    }

    public style: React.CSSProperties = {
        color: "#333"
    }

    public text: string = "段落文字"
}

export class State { }

但是 把 Gaea-Editor 作为一个组件放在 antd-mobile 项目里面,把同样的组件复制过去用就有错, component.tsx 文件里面 webstorm 提示 Unresolved variable this.props.style 和 this.props.text type.ts 文件里面 webstorm 提示 Unused field text...


我对 传参数的理解是 看到源代码中 loadPluginByPosition( 可以 传position,后面多的的 自动作为参数) 然后还知道 @inject(className) <==> new className() @Connect 用法如下:Connect 用于 修饰 react 组件 会自动使用 Provider 阶段注入的值

希望得到一些帮助,🙏

begoat commented 7 years ago

还有一个小问题就是 内置组件 下拉选择 的这个 组件 一拖 自动focus 了,不好实现流畅自由的拖动

ascoders commented 7 years ago

@begoat injectconnect 的理解都正确,loadPluginByPosition 是用来加载插件的内部方法,如果需要拓展编辑器需要用到,如果有需求,我会继续完善一下文档。但是这些和正确使用没有啥关系,我说的透传是指,把 antd 组件包一层:

CustomAntd.component.tsx

import * as React from "react"
import { Button } from "atnd"
import { Props, State } from "./CustomAntd.type"

export default class Text extends React.Component<Props, State> {
    public static defaultProps = new Props()
    public state = new State()

    public render() {
        return (
            <Button {...this.props}/>
        )
    }
}

但是 把 Gaea-Editor 作为一个组件放在 antd-mobile 项目里面,把同样的组件复制过去用就有错, component.tsx 文件里面

这句话没看懂什么意思,你是想把 gaea-editor 编辑器组件放到 antd-mobile 项目里?没这必要吧。

begoat commented 7 years ago

谢谢,我在多试试,理解理解🙏