【问题标题】:Material Design Component & reactjs input fields材料设计组件和 reactjs 输入字段
【发布时间】:2018-02-15 11:14:17
【问题描述】:

所以我最终让 MDC 使用 React 并使用 Google 文档,我发现当用户点击输入字段时,我需要 reactjs 来运行以下 JS - 基本上标签应该移动到输入上方,所以用户可以输入 - 就像我的纯 HTML / JS 演示 https://codepen.io/russellharrower/pen/oeReEN

但是使用 reactjs 我注意到我无法将下面的代码放在渲染区域中,所以我想知道我将它放在哪里以及如何放置?

(function() {
        var tfs = document.querySelectorAll(
          '.mdc-textfield:not([data-demo-no-auto-js])'
        );
        for (var i = 0, tf; tf = tfs[i]; i++) {
          mdc.textfield.MDCTextfield.attachTo(tf);
        }
      })();

完整的 reactjs 代码更新

import React, { Component } from 'react';
import './App.css';
import * as mdc from 'material-components-web';

class App extends Component {
    hrefjs(l){
            var script   = document.createElement("script");
            script.type  = "text/javascript";
            script.src   = l;    // use this for linked script
            document.body.appendChild(script);
    }


    componentWillMount() {
            this.hrefjs("//unpkg.com/material-components-web@latest/dist/material-components-web.min.js");
            var texst ="(function(){var tfs = document.querySelectorAll('.mdc-textfield:not([data-demo-no-auto-js])'); for (var i = 0, tf; tf = tfs[i]; i++) {mdc.textfield.MDCTextfield.attachTo(tf); mdc.autoInit();}})();"
            const script = document.createElement("script");
            script.text=texst;
            document.body.appendChild(script);
    };
  render() {
    return (
      <div className="App">
        <header className="mdc-toolbar mdc-toolbar--fixed mdc-toolbar--waterfall">
          <div className="mdc-toolbar__row">
            <section className="mdc-toolbar__section mdc-toolbar__section--align-start">
              <span className="mdc-toolbar__title">Title</span>
            </section>
          </div>
        </header>
        <main className="demo-main mdc-toolbar-fixed-adjust">

            <div className="mdc-form-field">
              <div className="mdc-checkbox">
                <input type="checkbox"
                       id="my-checkbox"
                       className="mdc-checkbox__native-control"/>
                <div className="mdc-checkbox__background">
                  <svg className="mdc-checkbox__checkmark"
                       viewBox="0 0 24 24">
                    <path className="mdc-checkbox__checkmark__path"
                          fill="none"
                          stroke="white"
                          d="M1.73,12.91 8.1,19.28 22.79,4.59"/>
                  </svg>
                  <div className="mdc-checkbox__mixedmark"></div>
                </div>
              </div>
              <label htmlhtmlhtmlFor="my-checkbox" id="my-checkbox-label">This is my checkbox</label>
            </div>
            <section className="example">
                 <div className="mdc-textfield">
                      <input type="text" id="username" className="mdc-textfield__input" aria-controls="username-helptext"/>
                      <label htmlFor="username" className="mdc-textfield__label">Username</label>
                    </div>
                    <p id="username-helptext" className="mdc-textfield-helptext" aria-hidden="true">
                      This will be displayed on your public profile
                    </p>
              </section>
        </main>
        <script>
        mdc.toolbar.MDCToolbar.attachTo(document.querySelector('.mdc-toolbar'));
        //mdc.textfield.MDCToolbar.attachTo(document.querySelector('.mdc-textfield'));
        //mdc.autoInit();
        </script>

        </div>
    );
  }
}

export default App;

最新更新 但是由于某种原因,我在 (function(){})(); 中添加了这两个函数。脚本,虽然它会发出警报等,但它不允许文本标签像 codepen.io 演示那样移动

hrefjs(l){
        var script   = document.createElement("script");
        script.type  = "text/javascript";
        script.src   = l;    // use this for linked script
        document.body.appendChild(script);
}


componentWillMount() {
        this.hrefjs("//unpkg.com/material-components-web@latest/dist/material-components-web.min.js");
        var texst ="(function(){var tfs = document.querySelectorAll('.mdc-textfield:not([data-demo-no-auto-js])'); for (var i = 0, tf; tf = tfs[i]; i++) {mdc.textfield.MDCTextfield.attachTo(tf); mdc.autoInit();}})();"
        const script = document.createElement("script");
        script.text=texst;
        document.body.appendChild(script);
};

【问题讨论】:

  • 您可以将javascript代码添加到您的componentDidMount。它会在组件渲染后运行
  • 感谢我在脚本运行时添加了 componentWillMount 部分,它似乎不喜欢我们附加脚本的事实。他们要先加载吗?
  • 我能够让它工作,使其成为一个 onClick 功能,但我确定这不是谷歌的想法吗?

标签: javascript reactjs material-components


【解决方案1】:

即使你的方法最终以某种方式奏效。它看起来确实不是一种非常愉快的继续开发方式,并且您的代码将成为其他人(或您自己)以后阅读的噩梦。 它实际上可以更容易地完成。我通常为 MDC 所需的组件编写 react.js 包装器。这是文本字段的示例:

import React from 'react';
import { MDCRipple } from '@material/ripple/dist/mdc.ripple';

class MdcButton extends React.Component {
    constructor(props) {
        super(props);
        // Init state
        this.state = {}
    }

    componentDidMount() {
        if (this.props.ripple)
            MDCRipple.attachTo(this.refs.button);
    }

    static defaultProps = {
        ripple: true,
        raised: true,
        disabled: false,
        className: "",
        type: "submit"
    }

    render() {
        let className = "mdc-button " + this.props.className;
        if (this.props.raised)
            className += " mdc-button--raised";

        return (
            <button
                ref="button"
                id={this.props.id}
                className={className}
                type={this.props.type}
                onClick={this.props.onClick}
                disabled={this.props.disabled}
            >
                {this.props.children}
            </button>
        );
    }
}

export default MdcButton

您可以在此处查看 react.js 的官方 mdc 演示 (https://github.com/material-components/material-components-web/tree/master/framework-examples/react)。

对于样式,我将 mdc sccs 文件包含到我的 scss 文件中并更改我需要的值。例如:

$mdc-theme-primary: #404040;
$mdc-theme-accent: #a349a3;
$mdc-theme-background: #fff;  

@import "@material/ripple/mdc-ripple";
@import "@material/typography/mdc-typography";
@import "@material/theme/mdc-theme";
@import "@material/button/mdc-button";

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2017-04-14
    • 2015-09-12
    相关资源
    最近更新 更多