React 组件化嵌套

React 组件化嵌套


组件

简单的理解组件就是,页面中可以有很多模块,如果将每个模块写成单独的组件,我就可以实现组件的复用。比如一个页面的头部,很多页面可能都会使用这个头部。
这里写图片描述
上面的页面,可以这样进行划分组件,其他的页面也可以调用。废话不多说,直接上代码看效果

代码

在这之前写过一篇webpack+React的热加载配置,这里就不写了,不会的可以点击下面的链接看看
webpack+React的热加载
这里就直接从代码入手

文件目录

热加载配置之后的文件目录为
这里写图片描述

(这里提示一下,只是根目录不一样)

然后在js文件夹下面创建一个components文件夹,用来存放所有的组件。下面的就是创建之后的文件目录。
这里写图片描述

然后就在components文件夹下创建组件,我这里用到了三个组件,就建三个组件js。header.js , footer.js , BodyIndex.js。

代码

首先写index.html

<div id="example">123</div>
<script src="bundle.js"></script>

这里的id为example的div为容器,引入的js是webpack打包之后的js文件。

然后我们进行组件的开发

header.js

import  React from 'react';
import ReactDom from 'react-dom';

export default class ComponentHeader extends React.Component{
    render(){
        return (
            <header>
                <h1>这里是头部</h1>
            </header>
        )
    }
}

BodyIndex.js

import React from 'react';

export default class BodyIndex extends React.Component{
    render(){
        return(
            <div>
                <h1>这里是主要的页面信息</h1>
            </div>
        )
    }
}

footer.js

import React from 'react';
import ReactDOM from 'react-dom';

export default class ComponentMyself extends React.Component{
    render(){
        return(
            <footer>
                <h3>这里是脚部</h3>
            </footer>
        )
    }
}

可以看见上面的代码差不多,只是组件名不一样,其中要注意的是:

  1. 因为是组价,要被其他组件引用,所以必须导出,不然别的地方获取不到这个组件。
  2. 在定义组件的时候是用class来定义的,继承于React的Component。
  3. 定义组件时,组件名的首字母必须大写。
  4. 返回时,只能将代码放入一个容器中返回,不能是一下的代码样式
export default class ComponentMyself extends React.Component{
    render(){
        return(
            <footer>
                <h3>这里是脚部</h3>
            </footer>
            <div>这是第二个容器</div>
        )
    }
}

接下来定义一个index.js,去调用前面的三个组件。

var React = require('react');
var ReactDOM = require('react-dom');
import ComponentHeader from './components/header';
import BodyIndex from './components/BodyIndex';
import ComponentMyself from './components/footer';

class Index extends React.Component{
    render(){
        return(
            <div>
                <ComponentHeader />
                <BodyIndex />
                <ComponentMyself />
            </div>
        )
    }
}

ReactDOM.render(
    <Index/>,
    document.getElementById('example')
)

可以看到这里调用组件的时候使用的是

import 组件名from '组件地址'

定义了一个Index组件,并调用其他三个组件,因为这个组件不被其他的调用,所以没有使用export。并且返回的也是一个容器。组件使用的时候,直接写组件名就可以了,也可以进行变量的替换。比如:

var React = require('react');
var ReactDOM = require('react-dom');
import ComponentHeader from './components/header';
import BodyIndex from './components/BodyIndex';
import ComponentMyself from './components/footer';

class Index extends React.Component{
    render(){
        var footer = <ComponentMyself />
        return(
            <div>
                <ComponentHeader />
                <BodyIndex />
                {footer}
            </div>
        )
    }
}

ReactDOM.render(
    <Index/>,
    document.getElementById('example')
)

最后就是将写的东西加载到页面中。使用ReactDOM.render()方法,获取到id为example的容易。到这里就已经完成了简单的组件嵌套。因为之前已经有热加载,这里只需要保存,然后在页面中打开webpack热加载后生成的那个地址就可以查看效果了。
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tiptap 2.0是一个基于ProseMirror的富文本编辑器,它提供了许多扩展性和可定制性选项。在React中实现组件嵌套并且可编辑的方式与tiptap 1.x类似,使用NodeViews和MarkViews来渲染节点和标记,并使用React组件来实现嵌套组件。 以下是一个在React中实现组件嵌套并且可编辑的示例: ```jsx import { Extension } from '@tiptap/core' import { NodeViewWrapper } from '@tiptap/react' import React from 'react' export default Extension.create({ name: 'customLink', defaultOptions: { url: '', title: '', }, addGlobalAttributes() { return [ { types: this.type.name, attributes: { url: { default: null, parseHTML: (element) => ({ url: element.getAttribute('href'), }), renderHTML: (attributes) => ({ href: attributes.url, }), }, title: { default: null, parseHTML: (element) => ({ title: element.getAttribute('title'), }), renderHTML: (attributes) => ({ title: attributes.title, }), }, }, }, ] }, addCommands() { return { setCustomLink: (attributes) => ({ commands }) => { return commands.insertContent({ type: this.type.name, attrs: attributes, content: [{ type: 'text', text: attributes.title }], }) }, } }, createNodeSpec() { return { attrs: { url: { default: null }, title: { default: null }, }, group: 'inline', inline: true, draggable: true, selectable: true, atom: true, toDOM: (node) => [ 'a', { href: node.attrs.url, title: node.attrs.title, }, 0, ], parseDOM: [ { tag: 'a[href]', getAttrs: (dom) => ({ url: dom.getAttribute('href'), title: dom.getAttribute('title'), }), }, ], } }, createNodeViews() { return { customLink: NodeViewWrapper.from((nodeViewProps) => { const { node, updateAttributes } = nodeViewProps const handleChange = (event) => { updateAttributes({ url: event.target.value, }) } return ( <a href={node.attrs.url} title={node.attrs.title}> <input type="text" value={node.attrs.url} onChange={handleChange} /> {nodeViewProps.children} </a> ) }), } }, }) ``` 在上面的示例中,我们创建了一个名为customLink的扩展,它使用了ProseMirror的NodeSpec和NodeViewWrapper来渲染节点。我们还为该扩展添加了一个全局属性,以及一个用于设置自定义链接的命令。 在createNodeSpec方法中,我们定义了节点的schema,指定了节点的属性、标签和解析/序列规则。 在createNodeViews方法中,我们定义了节点的视图组件。我们使用NodeViewWrapper将节点的属性和更新函数传递给React组件,以便在视图中进行编辑。在此示例中,我们将自定义链接的URL呈现为一个可编辑的文本框。 最后,我们将customLink扩展导出为默认值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值