React.js создайте div, который может перемещать объекты влево и вправо

#javascript #reactjs #material-ui

#javascript #reactjs #материал-пользовательский интерфейс

Вопрос:

Я пытаюсь создать простой div с левой и правой кнопками с каждой стороны, которые могут перемещать содержимое посередине влево и вправо.

Ближайшим примером этого является следующее:

введите описание изображения здесь


Затем, когда вы нажимаете стрелку вправо, он перемещается на этот экран.

введите описание изображения здесь

Есть ли React.js плагин, который может это сделать, или любой JavaScript-код с открытым исходным кодом?

В настоящее время мы показываем наши станции следующим образом:

 <Grid item lg={2} md={6} xs={12}>
  <Card onClick={handleClick} className={classes.card}>
    <CardMedia
      component='img'
      className={classes.media}
      image={props.icon}
      title={props.title}
    />
  </Card>
</Grid>
 

Комментарии:

1. Судя по вашему изображению, вам просто нужна простая разбивка на страницы (не совсем, но похоже на)

2. Если вы хотите анимацию, вы могли бы попробовать форму карусели, т.е. https://swiperjs.com/demos/#multiple_slides_per_view

Ответ №1:

Подумайте, что вы ищете для этого. Приведенный ниже код (и рабочий пример по ссылке) создаст «видоискатель». Вы можете использовать this и sub в своих изображениях и компонентах MUI. Я не хотел иметь дело со сторонней библиотекой, чтобы проиллюстрировать суть того, что делает код.

 import * as React from "https://cdn.skypack.dev/react@17.0.1";
import * as ReactDOM from "https://cdn.skypack.dev/react-dom@17.0.1";

const keanuMovies = [
  "Bill amp; Ted",
  "Bill amp; Ted 2",
  "Bill amp; Ted 3",
  "Dracula",
  "John Wick",
  "Matrix",
  "Matrix 2",
  "Matrix 3",
  "Point Break",
  "Speed"
];

// max number of items to show
const increment = 3;

const App = () => <MovieBrowser />;

const MovieBrowser = () => {
  const [visibleMovies, setVisibleMovies] = React.useState(
    keanuMovies.slice(0, increment)
  );
  const [leftEdge, setLeftEdge] = React.useState(0)
  // as long as we've gone right, we can go back left
  const canGoLeft = leftEdge > 0;
  // basically a "peak ahead" to see if the 
  // next right move will go beyond the array limit
  const canGoRight = leftEdge   increment <= keanuMovies.length - 1;

  const handleGoLeftClick = (goLeft = false) => {
    // if going left will fall blow the 0 index, reset to 0
    // else, decrement 
    const updatedLeftEdge = leftEdge - increment < 0 ? 0 : leftEdge - increment;

    setVisibleMovies(
      keanuMovies.slice(updatedLeftEdge, updatedLeftEdge   increment)
    );
    setLeftEdge(updatedLeftEdge);
  };
  
  const handleGoRightClick = (goLeft = false) => {
    // if going right will go past the array len, select 
    // the next index after the previous move right
    let updatedLeftEdge =
      leftEdge   increment > keanuMovies.length - 1
        ? leftEdge   increment - (keanuMovies.length - 1   increment)
        : leftEdge   increment;

    setVisibleMovies(
      keanuMovies.slice(updatedLeftEdge, updatedLeftEdge   increment)
    );
    setLeftEdge(updatedLeftEdge);
  };

  return (
    <div className="container">
      <h1>Keanu Movies</h1>
      <ul className="movies">
        {visibleMovies.map((movie) => (
          <li>{movie}</li>
        ))}
      </ul>
      <div className="actions">
        <button onClick={handleGoLeftClick} disabled={!canGoLeft}>
          Left
        </button>
        <button onClick={handleGoRightClick} disabled={!canGoRight}>
          Right
        </button>
      </div>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));

 

Комментарии:

1. спасибо, я буду использовать это в качестве руководства (поскольку мне нужно получить данные из JSON) — но вы мне очень помогли.

2. @RussellHarrower это был не я, это был Санта. 😉