【问题标题】:Creating a DatePicker from CDN with React API使用 React API 从 CDN 创建 DatePicker
【发布时间】:2020-09-28 19:50:24
【问题描述】:

我正在从 CDN 导入一些 React 模块(这不是必需的,我也尝试过使用本地构建,更多关于它的最后一个问题):

<script crossorigin src="https://unpkg.com/react-onclickoutside@6.9.0/dist/react-onclickoutside.min.js"></script>
<script crossorigin src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js" integrity="sha512-Izh34nqeeR7/nwthfeE0SI3c8uhFSnqxV0sI9TvTcXiFJkMd6fB644O64BRq2P/LA/+7eRvCw4GmLsXksyTHBg==" crossorigin="anonymous"></script>
<script crossorigin src="https://unpkg.com/react-datepicker@3.1.3/dist/react-datepicker.min.js"></script>

然后我有一个脚本来构建 React DatePicker 组件,这是它的相关 sn-p:

 HelloWorld.Example=function()
 {
  var p,setCount,count,p$1,c,myDate,datePicker;
  p=React$2.useState(0);
  setCount=p[1];
  count=p[0];
  p$1=React$2.useState(new moment(new Date((c=Date.now(),DateUtil.DatePortion(c)))));
  myDate=p$1[0];
  datePicker=React$2.createElement(DatePicker.default,{
   selected:new moment(new Date()),
   onChange:p$1[1]
  });
  React.set_setCount(setCount);
  return React$2.createElement("div",null,datePicker,React$2.createElement("p",null,(Html.textf(function($1)
  {

我从 JS 控制台看到的错误是:

react-datepicker.min.js:1 Uncaught TypeError: o is not a function
    at Ee (react-datepicker.min.js:1)

当脚本调用ReactDOM.render时。

有没有办法理解 o 是什么?也许缺少进口? (编辑好吧,查看 chrome 调试器并将其与 github 进行比较,oisValidDate,即 import isValidDate from "date-fns/isValid";,因此来自 date-fns 的导入在 CDN 中不起作用)

有没有一种方法——例如——我可以在本地 npm run build 所需的模块 react-datepicker,然后从我的脚本中调用 react API,如上所示? (我收到的建议是将我的脚本配置为 webpack 中的条目,但 afaik React 不使用 webpack,尽管我在 react-datepicker 中看到它是 used

来自React docs,我可以读到

JSX 不是使用 React 的必要条件

所以像上面这样的东西应该是可行的,理论上

我在 github react-datepicker repo 上打开了一个 question/issue(在从 WebSharper.React 调用此组件的上下文中)。

【问题讨论】:

    标签: javascript reactjs f# react-datepicker websharper


    【解决方案1】:

    有没有一种方法——例如——我可以在本地 npm run build 所需的模块 react-datepicker,然后从我的脚本中调用 react API,如上所示?

    是的,有一个众所周知的solution

    如下写一个index.js

    import React from "react";
    import DatePicker from 'react-datepicker'
    import "react-datepicker/dist/react-datepicker.css";
    
    export {ImportedComponent}
    
    window.MyDatePicker = function MyDatePicker(props) {
        console.log("props from window.MyDatePicker", props)
        return React.createElement( DatePicker, props );
      }
    

    通过npm 构建并将静态文件夹从npm run build 的构建中复制到项目的SPA 文件夹中

    复制 将 index.html 中的 3 个脚本标签构建到项目的 index.html 模板中 和 &lt;div id="root"&gt;&lt;/div&gt; (当然,您为您的项目应用程序使用不同的 id,并且 这里不会有任何东西可以渲染)

    在我的情况下它们是(它们对你来说会有所不同)

    <div id="root"></div>
    <script>!function(e){function t(t){for(var n,l,p=t[0],f=t[1],i=t[2],c=0,s=[];c<p.length;c++)l=p[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(a&&a(t);s.length;)s.shift()();return u.push.apply(u,i||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,p=1;p<r.length;p++){var f=r[p];0!==o[f]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return e}var n={},o={1:0},u=[];function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="/";var p=this.webpackJsonpcontent_npm=this.webpackJsonpcontent_npm||[],f=p.push.bind(p);p.push=t,p=p.slice();for(var i=0;i<p.length;i++)t(p[i]);var a=f;r()}([])</script>
    <script src="/static/js/2.a6e4c224.chunk.js"></script>
    <script src="/static/js/main.b075c560.chunk.js"></script>
    

    现在去

    datePicker=React$1.createElement(window.MyDatePicker,{
       selected:myDate,
       onChange:p$1[1],
       showTimeSelect: true,
      });
    

    在您的 SPA.js 中,享受来自 WebSharper.React 的任何类似这样的反应组件

    顺便说一句,我必须传递一个 JS 日期,而不是 propsselected 中的 Moment 日期,我不知道为什么,无论如何,这与问题无关。

    仅供参考,这是来自 WebSharper 项目的 F# 代码

    let myDate, setMyDate = WrapReact.UseState (DateTime.Today.JS)
    let importDatePicker = JS.Eval("window.MyDatePicker") :?> React.Class 
    let propDP = 
                    {
                        selected = myDate 
                        onChange = setMyDate
                        showTimeSelect = true
                    }
    let datePicker =
        React.CreateElement( importDatePicker, propDP)
    WrapReact.setCount <- setCount
    div [] [
        
        datePicker
        p [] [Html.textf "You selected %s date %s time" (myDate.ToDateString()) (myDate.ToTimeString())]
    

    完全开源项目shared on github.

    【讨论】:

      【解决方案2】:

      我认为主要问题是 WebSharper 脚本不是JavaScript modules。在这种情况下,应该立即导入外部模块或将上述SPA.js 作为Webpack 主条目。其实众所周知有differences between&lt;script type=module&gt;&lt;script&gt;

      • 以严格模式执行模块脚本
      • 模块脚本有自己的作用域
      • 模块脚本可以导入其他 Javascript 模块
      • 模块脚本将此作为未定义
      • 内联模块脚本可以有异步属性
      • 模块脚本总是延迟

      作为 confirmed by Adam Granicz 确实在 WebSharper 方面:

      应该是这样,是的,@Jand42 和其他人一直在努力改变当前的输出以支持模块和更好的 TS 互操作性 - 这已经提上日程多年了,所以关闭它将是向前迈出的一大步

      (与此同时,当然还有其他选择,例如flatpickr,它也为 jQuery 提供绑定,而不是 react-datepicker 或纯 React 或 F# Fable 而不是 WebSharper.React 等等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多