Инициализировать компонент materializecss в React

Я пытаюсь добавить слайдер изображений Carousel из MaterializeCSS в простой компонент React, но не могу его инициализировать! Было бы очень полезно знать, где это сделать в моем коде.

import React, { Component } from 'react';
import { M } from 'materialize-css/dist/js/materialize.min.js';

export default class Slider extends Component {
  componentDidMount() {
   var elem = document.querySelector('.carousel');
   var instance = M.Carousel.init(elem, { duration: 200 });
 }
render() {
 return (
  <div className = "container center-align">
   <h1 className = "header pink-text">Slider</h1>
    <div className = "carousel">
      <a className = "carousel-item" href = "#one!">
        <img src = "https://www.w3schools.com/images/picture.jpg" />
      </a>
      <a className = "carousel-item" href = "#two!">
        <img src = "../../public/images/lana/1.jpg" />
      </a>
      <a className = "carousel-item" href = "#three!">
       <img src = "../../public/images/lana/1.jpg" />
      </a>
      <a className = "carousel-item" href = "#four!">
       <img src = "../../public/images/lana/1.jpg" />
      </a>
       <a className = "carousel-item" href = "#five!">
        <img src = "../../public/images/lana/1.jpg" />
       </a>
     </div>
    </div>
  );
 }
}

это дает мне ошибку: Невозможно прочитать свойство "Карусель" неопределенного значения.

Я пытался сделать это с помощью JQuery, без ошибок, но не сработало!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
5 212
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Похоже, вы используете файл .min для импорта M из. Вместо этого вы должны установить MaterializeCSS как узел узла. Вы получаете сообщение об ошибке, потому что M ни как не определяется. Из этого файла .min нет экспорта.

Если вы хотите дождаться загрузки скрипта, лучше сделать это с помощью обратного вызова вместо setTimeout.

function loadScript(url, callback) {
  var script = document.createElement("script")
  script.type = "text/javascript";
  if (callback) { 
    script.onload = callback; 
  }
  document.body.appendChild(script)
  script.src = url;
}


loadScript(pathtoscript, function() {
  alert('script ready!'); 
});

Спасибо за ответ. Итак, независимо от моего кода, как я могу реализовать этот MaterializeCSS JS внутри приложения?

Mohamed Youssef 30.04.2018 09:53

Вместо использования setTimeout вам следует дождаться загрузки скрипта и затем выполнить обратный вызов.

Jakub Kawalec 30.04.2018 18:34

Спасибо, Якуб, вы правы, мне нужно преобразовать его в обратный вызов, мне нужно получить изображения из того же каталога и передать их в карусель, я знаю, как именно это сделать!

Mohamed Youssef 10.05.2018 03:50

Если ответ поможет, можете ли вы отметить его как правильный?

Jakub Kawalec 10.05.2018 03:53

Я сделал, если хотите, можете также помочь мне в моей конкретной ситуации :)

Mohamed Youssef 10.05.2018 04:49

Конечно, просто напишите в комментариях, и я постараюсь помочь и обновить свой ответ, если это необходимо.

Jakub Kawalec 10.05.2018 05:02

Если вы хотите использовать файл min.js в своем приложении, попробуйте добавить его в файл html с помощью тега.

В качестве альтернативы попробуйте добавить модули узлов с помощью пакета npm.

Надеюсь это поможет.

Спасибо за ответ, я попытался добавить CDN в HTML и инициализировать его там, но не сработало!

Mohamed Youssef 30.04.2018 09:51

вы пробовали эти - <! - Скомпилированный и минимизированный CSS -> <link rel = "stylesheet" href = "cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-beta/‌ css /…"> <! - Скомпилированный и минимизированный JavaScript -> <script src = "cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-beta/j‌ s /…>

mindaJalaj 30.04.2018 10:11

Да. Я сделал аналогичную идею проекта с обычным html, и он отлично работает, idk, где я должен инициализировать компоненты Materialize внутри React

Mohamed Youssef 30.04.2018 13:42

Ознакомьтесь с этой ссылкой-react-materialize.github.io/#, для карусели вам, возможно, придется импортировать, например, - import {Carousel} из 'response-materialize'

mindaJalaj 30.04.2018 14:17

Спасибо, очень признателен

Mohamed Youssef 30.04.2018 18:02

Я попробую, у меня это сработало, когда я использовал функцию setTimeout () и инициализацию вызова в ней

Mohamed Youssef 30.04.2018 18:08

Я понял, что для рендеринга контента требуется некоторое время. Когда я использую функцию setTimeout() и вызываю эти строки инициализации JS, она работает.

можете ли вы предоставить фрагмент кода, который вы использовали, чтобы заставить это работать? поскольку я сталкиваюсь с аналогичной проблемой, инициализируется с помощью npm

Blah blah 16.05.2018 22:10

пожалуйста Бла, проверь мой новый комментарий, надеюсь, он тебе поможет

Mohamed Youssef 20.05.2018 18:22

Я инициализирую js-код Carousel с главной html-страницы с помощью функции setTimeout (), я использовал счетчик, чтобы он выглядел немного лучше

это выглядит так

<script>

    setTimeout(() => {
      var elem = document.querySelector('.carousel');
      var instance = M.Carousel.init(elem, {});
      if (document.querySelector('.photos').classList) {
        document.querySelector('.photos').classList.remove("spinner")
      }
    }, 2000)
  </script>

Я была такая же проблема.

Решил, добавив модуль npm materializecss

npm install materialize-css

а затем импортировать его в компонент

import M from "materialize-css";

и в методе componentDidUpdate добавлен init

componentDidUpdate() {

    let collapsible = document.querySelectorAll(".collapsible");

    M.Collapsible.init(collapsible, {});
  }

Задача решена!!

Используя React Hook с useEffect, вы также можете инициализировать каждую функцию в Materialize, например:

    import React, { useEffect, Fragment } from "react";

    import M from "materialize-css/dist/js/materialize.min.js";
useEffect(() => {
    // Init Tabs Materialize JS
    let tabs = document.querySelectorAll(".tabs");
    M.Tabs.init(tabs);
});

В моем случае я использовал вкладки для инициализации функции материализации.

добавить окно М. ...

  useEffect(() => {
var elem = document.querySelector(".carousel");
var instance = window.M.Carousel.init(elem, {
  fullWidth: true,
  indicators: true,
});

});

Другие вопросы по теме