Модальные окна Reactjs и antd - проблемы с кодом

Я новичок в reactjs и пытаюсь использовать модальные функции antd. Однако, когда я включаю базовый пример кода в свою базу кода, у меня остаются некоторые ошибки - мне пришлось удалить двоеточия, конечные запятые, и я получаю сообщение об ошибке с переменной состояния.

https://ant.design/components/modal/

import { Modal, Button } from 'antd';

class App extends React.Component {
  state = { visible: false }
  showModal = () => {
    this.setState({
      visible: true,
    });
  }
  handleOk = (e) => {
    console.log(e);
    this.setState({
      visible: false,
    });
  }
  handleCancel = (e) => {
    console.log(e);
    this.setState({
      visible: false,
    });
  }
  render() {
    return (
      <div>
        <Button type="primary" onClick={this.showModal}>Open</Button>
        <Modal
          title="Basic Modal"
          visible={this.state.visible}
          onOk={this.handleOk}
          onCancel={this.handleCancel}
        >
          <p>Some contents...</p>
          <p>Some contents...</p>
          <p>Some contents...</p>
        </Modal>
      </div>
    );
  }
}

ReactDOM.render(<App />, mountNode);

Моя ошибка - синтаксическая ошибка? Я пытался установить состояние в конструкторе, но тогда он не определен.

client:119 ./src/components/Video/VideoConference.js
Module build failed: SyntaxError: D:/wamp/www/e-profound-react/src/components/Video/VideoConference.js: Unexpected token (631:8)

  629 |   }
  630 | 
> 631 |   state = { visible: false }
      |         ^
  632 |   showModal () {
  633 |     this.setState({
  634 |       visible: true,

 @ ./src/router.js 35:0-65
 @ ./src/index.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./index.js

мой код выглядит более сложным, но выглядит так.

class VideoConference extends React.Component {

  constructor (props) {
    super(props)
  }

  componentWillMount () {

  }

  componentWillUnmount () {
  }

  componentDidMount () {
  }

  state = { visible: false }
  showModal () {
    this.setState({
      visible: true,
    })
  }
  handleOk (e) {
    console.log(e)
    this.setState({
      visible: false,
    })
  }
  handleCancel (e) {
    console.log(e)
    this.setState({
      visible: false,
    })
  }

  render () {

    return (
      <div>
        <Spacers />

        <Button type='primary' onClick={this.showModal}>Open</Button>
        <Modal
          title='Basic Modal'
          visible={this.state.visible}
          onOk={this.handleOk}
          onCancel={this.handleCancel}
        >
          <p>Some contents...</p>
          <p>Some contents...</p>
          <p>Some contents...</p>
        </Modal>

      </div>
    )
  }
}

person The Old County    schedule 10.07.2017    source источник


Ответы (3)


В вашем примере показано, как использовать state вне contructor метода. Это называется class properties и не является частью спецификации ES6.

Сначала вы должны знать синтаксис стандартного / стандартного реагирования класса ES6:

// example code here
import React, { Component } from 'react';

class App extends Component {  // same as React.Component
  constructor(props) {
    super(props); // you always need to call super();

    this.state = {
      visible: false,
    }
  }

  // other methods, lifecycle methods, render method etc.
  // ...
}

Чтобы использовать class properties, вам необходимо установить плагин babel babel-plugin-transform-class-properties. Примеры и руководство по установке см. здесь.

Если вы используете webpack2, вот моя настройка babel. Может быть вам полезно:

...
module: {
  rules: [
    // .js(x) loading
    {
      test: /\.jsx?$/,
      exclude: /node_modules/,
      use: [
        {
          loader: 'babel-loader',
          query: {
            // Ignore the .babelrc at the root of our project-- that's only
            // used to compile our webpack settings, NOT for bundling
            babelrc: false,
            presets: [
              ['env', {
                // Enable tree-shaking by disabling commonJS transformation
                modules: false,
                // Exclude default regenerator-- we want to enable async/await
                // so we'll do that with a dedicated plugin
                exclude: ['transform-regenerator'],
              }],
              // Transpile JSX code
              'react',
            ],
            plugins: [
              'transform-object-rest-spread',
              'syntax-dynamic-import',
              'transform-regenerator',
              'transform-class-properties',
              'transform-decorators-legacy',
            ],
          },
        },
      ],
    },
  ],
},
...
person loelsonk    schedule 10.07.2017
comment
- Вы размещаете свои методы в этой части babel-загрузчика? - person The Old County; 10.07.2017
comment
мой загрузчик babel выглядит просто? - {include: resolve ('src'), test: /\.js$/, loader: 'babel-loader', exclude: '/ node_modules'}, - person The Old County; 10.07.2017
comment
Оставьте как есть. Если вы не понимаете мой config. Работайте над своим. Прочтите здесь babeljs.io/docs/plugins/transform-class-properties. вы можете добавить этот babel плагин, используя .babelrc файл. - person loelsonk; 10.07.2017
comment
@TheOldCounty Отвечая на ваш вопрос is there a way of invoking these modals - just like jquery -- $('#feedback').modal(): Я думаю, <Modal title="Basic Modal" visible={this.state.visible} эта visible опора имеет логику для отображения / скрытия вашего модального окна. Итак, если вы реализуете state.visible переключение, то все в порядке. - person loelsonk; 10.07.2017
comment
Я думаю, что здесь произойдет - будет ли загружена - скрытая разметка - так - будет ли случай создания нескольких состояний / видимых? - this.feedbackstate.visible - this.feedbackthankyou.visible? - person The Old County; 10.07.2017
comment
@TheOldCounty вы объявляете state только один раз. Итак, если у вас несколько модальных окон, вы можете использовать такой мелкий объект this.state = { modalOneVisible: false, modalTwoVisible: false, modalThreeVisible: false }; - person loelsonk; 10.07.2017
comment
@TheOldCounty Прежде чем вы начнете кодировать в React, я настоятельно рекомендую вам прочитать об основах, посмотреть руководства на YouTube и так далее. Если вы хотите учиться, я предлагаю вам проверить, например, курс реагирования stephen grider на udemy. - person loelsonk; 10.07.2017
comment
@TheOldCounty Если мой ответ вам подходит, примите его. Если у вас есть другие вопросы, не стесняйтесь спрашивать. - person loelsonk; 10.07.2017
comment
Я добавил функции в конструктор - конструктор this.handleCancel = this.handleCancel.bind (this) - person The Old County; 10.07.2017

Вы должны указать начальное состояние в конструкторе класса (https://facebook.github.io/react/docs/state-and-lifecycle.html)

constructor(props){
  super(props);
  this.state = { visible: false }
}
person Henrique Oecksler Bertoldi    schedule 10.07.2017
comment
Когда я это сделаю - это станет неопределенным - person The Old County; 10.07.2017
comment
Uncaught TypeError: невозможно прочитать свойство setState из undefined - person The Old County; 10.07.2017
comment
- поэтому, когда я нажимаю на кнопку - функция showModal извергает это - person The Old County; 10.07.2017
comment
Жаль, что я сделал ошибку. Попробуйте сейчас, я редактировал код. - person Henrique Oecksler Bertoldi; 10.07.2017
comment
Функции дескриптора не находятся в контексте класса. Вы должны привязать контекст this к этим функциям. Я делаю это в конструкторе this.handleCancel = this.handleCancel.bind (this). - person Henrique Oecksler Bertoldi; 10.07.2017
comment
@HenriqueOeckslerBertoldi С плагинами babel вы можете использовать state внешний contructor метод, который становится ненужным для инициирования вашего состояния для реакции class components. - person loelsonk; 10.07.2017
comment
- это работает - хорошо - но язык на кнопках китайский? ржу не могу - person The Old County; 10.07.2017
comment
@TheOldCounty Прокомментируйте, пожалуйста, мой ответ, а не это. Какой пример вам нужен? Я не понимаю. Вы прочитали мой ответ? - person loelsonk; 10.07.2017
comment
есть ли способ вызвать эти модальные окна - точно так же, как jquery - $ ('# feedback'). modal () - person The Old County; 10.07.2017

реагировать initial state и класс ES 6

import { Modal, Button } from 'antd';

class App extends React.Component {
  constructor(props){
      super(props);
      this.state  = {
          visible: false
      };
  }
  showModal = () => {
    this.setState({
      visible: true,
    });
  }
  handleOk = (e) => {
    console.log(e);
    this.setState({
      visible: false,
    });
  }
  handleCancel = (e) => {
    console.log(e);
    this.setState({
      visible: false,
    });
  }
  render() {
    return (
      <div>
        <Button type="primary" onClick={this.showModal}>Open</Button>
        <Modal
          title="Basic Modal"
          visible={this.state.visible}
          onOk={this.handleOk}
          onCancel={this.handleCancel}
        >
          <p>Some contents...</p>
          <p>Some contents...</p>
          <p>Some contents...</p>
        </Modal>
      </div>
    );
  }
}

ReactDOM.render(<App />, mountNode);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

person Community    schedule 12.07.2017