在 HTML 页面中使用 React的场景分析


Posted in Javascript onJanuary 18, 2022

该方案使用场景:在html页面中使用react,主js文件index.js和其它非react功能使用js模块化的方式开发,适合轻量级中小型应用

index.html代码:

引入react、react-dom、babel、moment、antd等

<!DOCTYPE html>
<html lang='zh-CN'>

<head>
    <title>React in HTML</title>

    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="libs/antd/antd.min.css">
    <link rel="stylesheet" href="css/index.css">

    <style type="text/css">

    </style>

    <script type="text/javascript" src="libs/jquery-1.9.1.js"></script>

    <script type="text/javascript" src="libs/react/react.production.min.js"></script>
    <script type="text/javascript" src="libs/react/react-dom.production.min.js"></script>
    <script type="text/javascript" src="libs/babel/babel.min.js"></script>
    <script type="text/javascript" src="libs/moment/moment-with-locales.min.js"></script>
    <script type="text/javascript" src="libs/antd/antd-with-locales.min.js"></script>

</head>

<body>
    <input id='btn' type="button" class="index-btn" value="显示React组件" />

    <script type="text/babel" src="components/HelloReact.jsx"></script>

    <script type="module" src="index.js"></script>
</body>

</html>

index.js代码:

import { ReactComponentContainer } from './ReactComponentContainer.js'

let isShow = true;
let helloReactContainer;

$('#btn').on('click', function () {
    if (isShow) {
        helloReactContainer = new ReactComponentContainer('helloReact', HelloReact, { name: 'React' });
        helloReactContainer.show();
        isShow = false;
        $(this).val('隐藏React组件');
    } else {
        helloReactContainer.hide();
        isShow = true;
        $(this).val('显示React组件');
    }
});

ReactComponentContainer.js代码:

该模块用于在html中显示隐藏react组件

class ReactComponentContainer {

    component
    componentProps
    componentContainerId

    constructor(componentContainerId, component, componentProps) {
        if ($('#' + componentContainerId).length == 0) {
            $('body').append('<div id="' + componentContainerId + '"></div>');
        }

        this.componentContainerId = componentContainerId;
        this.component = component;
        this.componentProps = componentProps;
    }

    render(isShow) {
        ReactDOM.render(
            React.createElement(
                antd.ConfigProvider,
                {
                    locale: antd.locales.zh_CN
                },
                React.createElement(this.component, Object.assign({ isShow: isShow }, this.componentProps))
            ),
            document.getElementById(this.componentContainerId)
        );
    }

    show() {
        this.render(true);
    }

    hide() {
        this.render(false);
    }

}

export { ReactComponentContainer }

HelloReact.jsx代码:

class HelloReact extends React.Component {
    dateFormat = 'YYYY-MM-DD'
    timeFormat = 'HH:mm:ss'

    constructor(props) {
        super(props);

        let now = new Date().valueOf();

        this.state = {
            dateStr: moment(now).format(this.dateFormat),
            timeStr: moment(now).format(this.timeFormat)
        }

        this.onChangeDate = this.onChangeDate.bind(this);
        this.onChangeTime = this.onChangeTime.bind(this);
        this.updateDatePickerAndTimePicker = this.updateDatePickerAndTimePicker.bind(this);
    }

    onChangeDate(date, dateString) {
        this.setState({ dateStr: dateString });
    }

    onChangeTime(time, timeString) {
        this.setState({ timeStr: timeString });
    }

    updateDatePickerAndTimePicker() {
        let now = new Date().valueOf();
        this.setState({
            dateStr: moment(now).format(this.dateFormat),
            timeStr: moment(now).format(this.timeFormat)
        });
    }

    render() {
        return <div style={{ display: this.props.isShow ? '' : 'none' }}>
            <h1>Hello {this.props.name}, Now is {this.state.dateStr} {this.state.timeStr}</h1>
            <antd.DatePicker onChange={this.onChangeDate} value={moment(this.state.dateStr, this.dateFormat)} />
             
            <antd.TimePicker onChange={this.onChangeTime} value={moment(this.state.timeStr, this.timeFormat)} />
            <br />
            <antd.Button type="primary" size="default" style={{ marginTop: '10px' }} onClick={this.updateDatePickerAndTimePicker} >更新日期时间控件值</antd.Button>
        </div>;
    }
}

效果图:

在 HTML 页面中使用 React的场景分析

浏览器按F12弹出DevTools,在Sources选项卡中可以看到组件代码,方便打断点调试

在 HTML 页面中使用 React的场景分析

遇到的问题:

无法使用es6的import语法导入react组件,es6的import和require.js都不认识jsx

react组件不是按需加载,只适合小型应用

Gitee代码地址:

https://gitee.com/s0611163/react-in-html

到此这篇关于在 HTML 页面中使用 React的文章就介绍到这了,更多相关html使用react内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
Javascript 相关文章推荐
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
关于JSON与JSONP简单总结
Aug 16 Javascript
Bootstrap table的使用方法
Nov 02 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
JavaScript登录验证基础教程
Nov 01 Javascript
在 Angular中 使用 Lodash 的方法
Feb 11 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
Sep 10 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 Javascript
移动端吸顶fixbar的解决方案详解
Jul 17 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
Sep 15 Javascript
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 #Vue.js
浅谈JavaScript作用域
Dec 06 #Javascript
JavaScript流程控制(循环)
Dec 06 #Javascript
JavaScript流程控制(分支)
Dec 06 #Javascript
JavaScript实现队列结构过程
Dec 06 #Javascript
JavaScript实现栈结构详细过程
Dec 06 #Javascript
JavaScript实现优先级队列
Dec 06 #Javascript
You might like
一些常用的php函数
2006/12/06 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
PHP对象相关知识总结
2017/04/09 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
numpy添加新的维度:newaxis的方法
2018/08/02 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python实现文件的备份流程详解
2019/06/18 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Python列表元素常见操作简单示例
2019/10/25 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
婚纱摄影师求职信
2014/03/07 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
珠宝店促销方案
2014/03/21 职场文书
消防标语大全
2014/06/07 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
医院合作意向书范本
2015/05/08 职场文书
入党后的感想
2015/08/10 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL