Не удается заставить кнопки воспроизведения и паузы работать должным образом с iFrame

Я пытался встроить случайные видео YouTube из массива в свое приложение React Native. Пока это работает хорошо, каждый раз, когда я перехожу на другой экран, а затем обратно, появляется другое видео! Теперь я пытаюсь реализовать внешние кнопки паузы/воспроизведения! Они хорошо работают, когда в массиве есть только одна ссылка на YouTube! Однако, если я добавлю другие ссылки, кнопки воспроизведения / паузы начнут глючить, и каждый раз, когда я нажимаю одну, она либо ничего не делает, либо ведет к другому видео, либо приостанавливает видео! Я не думаю, что это случайно, кажется, есть система того, что не работает, но я просто не могу понять это! Можно предположить, что проблема связана с состояниями «воспроизведения» и что иногда видео не воспроизводится, даже если оно воспроизводится === true? Ну, ИДК, может быть, кто-то из вас может помочь! вот код:

import React, { useState, useCallback, useRef } from "react";
import { Button, View, Alert, Text } from "react-native";
import YoutubePlayer from "react-native-youtube-iframe";
import {NeuView, NeuButton} from 'react-native-neu-element';
import { set } from "react-native-reanimated";
//import {LinearGradient} from 'expo-linear-gradient';
//import {LinearGradient} from 'react-native-linear-gradient';

//example vids
const videos = [
  'iNQAp2RtXBw',
  'AJqiFpAl8Ew',
  'IdoD2147Fik',
]

const randomVideo = () =>
videos[Math.floor(Math.random() * videos.length)];

export default function funnyVideos() {
  const [playing, setPlaying] = useState(false);

  function pause() {
    if (playing === true) {
      setPlaying(false)
    }
  }
  function play() {
    if (playing === false) {
      setPlaying(true)
    }
  }
  
    
 

return (
    <View  alignItems = 'center' >
      <NeuView style = {{marginTop: '15%'}}  width = {330} height = {200} color = '#f2f2f2' borderRadius = {20} >
        <View overflow = 'hidden' height = {169}  style = {{position: 'relative', marginTop: 0}} justifyContent = 'center' alignContent = 'center' borderRadius = {10}> 

          <YoutubePlayer
            height = {'100%'}
            width = {300}
            videoId = {randomVideo()}
            play = {playing}
          />
      </View>
    </NeuView>
    
    <View flexDirection = 'row'>
      <NeuButton style = {{marginTop: 60, marginRight: 45}}  width = {100}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} onPress = {play} borderRadius = {20}>
        <Text>
          play
        </Text>
      </NeuButton>
      <NeuButton style = {{marginTop: 60}}  width = {100}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} onPress = {pause} borderRadius = {20}>
        <Text>
          pause
        </Text>
      </NeuButton>
    </View>
      <NeuButton style = {{marginTop: 45}} width = {250}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} borderRadius = {20}>
        <Text>
          Next Video
        </Text>
      </NeuButton>

    
    </View>
  ); 
}

Установите случайное видео в useState, чтобы не вызывать randomVideo() каждый рендер.

charlietfl 26.12.2020 15:51

Как именно я могу это сделать?:D Я еще не очень хорошо разбираюсь в хуках

Swifter 26.12.2020 16:01
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
826
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это сделает работу, а также я взял на себя смелость улучшить код.

import React, { useState, useCallback, useRef } from "react";
import { Button, View, Alert, Text } from "react-native";
import YoutubePlayer from "react-native-youtube-iframe";
import {NeuView, NeuButton} from 'react-native-neu-element';
import { set } from "react-native-reanimated";

//example vids
const videos = [
  'iNQAp2RtXBw',
  'AJqiFpAl8Ew',
  'IdoD2147Fik',
]

const randomVideo = () =>
videos[Math.floor(Math.random() * videos.length)];

export default function FunnyVideos() {
  const [playing, setPlaying] = useState(false);
    const [videoId, setRandomVideoId] = useState(randomVideo());

  const pauseOrPlay = () => useCallback({
    setPlaying(!playing)
  },[playing])

  return (
    <View  alignItems = 'center' >
      <NeuView style = {{marginTop: '15%'}}  width = {330} height = {200} color = '#f2f2f2' borderRadius = {20} >
        <View overflow = 'hidden' height = {169}  style = {{position: 'relative', marginTop: 0}} justifyContent = 'center' alignContent = 'center' borderRadius = {10}> 

          <YoutubePlayer
            height = {'100%'}
            width = {300}
            videoId = {videoId}
            play = {playing}
          />
      </View>
    </NeuView>
    
    <View flexDirection = 'row'>
      <NeuButton style = {{marginTop: 60, marginRight: 45}}  width = {100}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} onPress = {play} borderRadius = {20}>
        <Text>
          play
        </Text>
      </NeuButton>
      <NeuButton style = {{marginTop: 60}}  width = {100}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} onPress = {pause} borderRadius = {20}>
        <Text>
          pause
        </Text>
      </NeuButton>
    </View>
      <NeuButton style = {{marginTop: 45}} width = {250}  height = {100} color = '#f2f2f2' title = {playing ? "pause" : "play"} borderRadius = {20}>
        <Text>
          Next Video
        </Text>
      </NeuButton>

    
    </View>
  ); 
}

«Это сделает работу» на самом деле не объясняет, что было изменено или почему

charlietfl 26.12.2020 16:40

Добавлено состояние для randomVideoId, чтобы каждый раз, когда вы возвращаетесь на эту страницу, функция randomVideo не вызывалась. Изменен метод воспроизведения и паузы и объединены в один метод.

Rajat Jain 26.12.2020 16:47

Лучше всего объяснить те вещи в ответе, которые вы можете редактировать в любое время.

charlietfl 26.12.2020 16:55

Большое спасибо вам обоим за ваше время и помощь! Я все еще не могу заставить его работать :( теперь он говорит, что '!' из setPlaying(!playing) в строке 22 является неожиданным токеном! Сейчас я попробовал несколько вещей, но я просто не могу заставить его работать !

Swifter 26.12.2020 18:16

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