Я пытаюсь добавить слайдер изображений 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, без ошибок, но не сработало!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вы используете файл .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!');
});
Вместо использования setTimeout вам следует дождаться загрузки скрипта и затем выполнить обратный вызов.
Спасибо, Якуб, вы правы, мне нужно преобразовать его в обратный вызов, мне нужно получить изображения из того же каталога и передать их в карусель, я знаю, как именно это сделать!
Если ответ поможет, можете ли вы отметить его как правильный?
Я сделал, если хотите, можете также помочь мне в моей конкретной ситуации :)
Конечно, просто напишите в комментариях, и я постараюсь помочь и обновить свой ответ, если это необходимо.
Если вы хотите использовать файл min.js в своем приложении, попробуйте добавить его в файл html с помощью тега.
В качестве альтернативы попробуйте добавить модули узлов с помощью пакета npm.
Надеюсь это поможет.
Спасибо за ответ, я попытался добавить CDN в HTML и инициализировать его там, но не сработало!
вы пробовали эти - <! - Скомпилированный и минимизированный 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 /…>
Да. Я сделал аналогичную идею проекта с обычным html, и он отлично работает, idk, где я должен инициализировать компоненты Materialize внутри React
Ознакомьтесь с этой ссылкой-react-materialize.github.io/#, для карусели вам, возможно, придется импортировать, например, - import {Carousel} из 'response-materialize'
Спасибо, очень признателен
Я попробую, у меня это сработало, когда я использовал функцию setTimeout () и инициализацию вызова в ней
Я понял, что для рендеринга контента требуется некоторое время. Когда я использую функцию setTimeout() и вызываю эти строки инициализации JS, она работает.
можете ли вы предоставить фрагмент кода, который вы использовали, чтобы заставить это работать? поскольку я сталкиваюсь с аналогичной проблемой, инициализируется с помощью npm
пожалуйста Бла, проверь мой новый комментарий, надеюсь, он тебе поможет
Я инициализирую 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,
});
});
Спасибо за ответ. Итак, независимо от моего кода, как я могу реализовать этот MaterializeCSS JS внутри приложения?