【问题标题】:How to use/expose vivus.js methods in react如何在反应中使用/公开 vivus.js 方法
【发布时间】:2019-12-13 00:25:33
【问题描述】:

我正在为 vivus.js 库使用 react 组件,但不知道如何使用它的方法,例如我想在幻灯片更改时调用 myVivus.play(),但不确定如何。我只是在学习反应,因为我知道我需要公开组件的方法才能在渲染中使用它,但到目前为止我所有的尝试都没有成功。任何帮助深表感谢!谢谢。

import React from 'react';
import ReactVivus from 'react-vivus';
import ReactFullpage from '@fullpage/react-fullpage'
import Svg1 from './example.svg';
import Svg2 from './example2.svg';


const Anim1 = () => (
  <ReactVivus
    id="anim1"
    option={{
      file: Svg1,
      animTimingFunction: 'EASE',
      type: 'oneByOne',
      onReady: console.log
    }}
    callback={console.log}
  />
);

const Anim2 = () => (
  <ReactVivus
    id="anim1"
    option={{
      file: Svg2,
      animTimingFunction: 'EASE',
      type: 'oneByOne',
      onReady: console.log
    }}
    callback={console.log}
  />
);


const FullpageWrapper = fullpageProps => (
  <div>
  <SEO title="Home" />
  <Menu>
    <MenuContainer>Logo</MenuContainer>
  </Menu>
  <ReactFullpage
    {...fullpageProps}

    //fullpage options
    licenseKey = {'***'}
    navigation
    anchors={['intro', 'reasonOne', 'reasonTwo']}
    sectionsColor={['#4e5c9e', '#d3d7f2', '#F5F5F6']}

    render={({ state, fullpageApi }) => {


      return (
        <div id="fullpage-wrapper">
          <div className="section section1 light">
            <SlideWrapper>
              <TextBlock>
                <SlideHeader>Header 1</SlideHeader>
                <SlideDescription>Description text 1</SlideDescription>
              </TextBlock>

              <AnimationBlock>
                <Anim1/>
                <button onClick={() => this.play()} >Play</button>
              </AnimationBlock>
            </SlideWrapper>
          </div>

          <div className="section section2">
            <SlideWrapper>

              <AnimationBlock>
               <Anim2/>
              </AnimationBlock>

              <TextBlock>
                <SlideHeader>Header 2</SlideHeader>
                <SlideDescription>>Description text 2</SlideDescription>
              </TextBlock>

            </SlideWrapper>
          </div>

          ...


        </div>

      );
    }}
  />

  </div>

);


export default FullpageWrapper;


【问题讨论】:

  • 您想通过按钮以编程方式触发动画,但组件在没有用户操作的情况下自行设置动画,对吧?
  • @EmmanuelMericdeBellefon 我正在使用 FullPage.js 库创建一个页面部分,每个部分都有 vivus.js 动画。在滚动/部分更改时,我想触发动画(再次播放)。现在它只在页面加载时播放一次。

标签: reactjs vivus


【解决方案1】:

好的,所以问题是 react-vivus 是一个围绕 vivus.js 的小包装器,但并不完整。 该库的创建者不允许任何方式调用您想要调用的来自 vivus.js 的方法,例如 play。顺便提一下这个here的问题。

也就是说,你想要的可以用一些棘手的代码来完成,就像这样:

import React, {useState} from 'react';
import ReactVivus from 'react-vivus';
import svg from './example.svg';

const MyVivus = () => (
  <ReactVivus
    id="foo"
    option={{
      file: svg,
      animTimingFunction: 'EASE',
      type: 'oneByOne',
      onReady: console.log
    }}
    style={{ height: '100px', width: '100px' }}
    callback={console.log}
  />
);

function App() {
  const [show, setShow] = useState(true)

  const handleReset = () => {
    setShow(false) // unmounting here
    setInterval(() => setShow(true), 0) // re-mounting a fraction of second later
  } 

  return (
    <React.Fragment>
      {show ? <MyVivus/> : null}
      <button onClick={handleReset}>reset</button>
    </React.Fragment>
  );
}

发生的情况是,我们移除了组件并很快将其放回原处,因此动画再次触发。

将其集成到您的代码中:

const FullpageWrapper = fullpageProps => {
  const [shown, setShown] = useState(true)

  const handlePlay = () => {
    setShown(false)
    setInterval(() => setShown(true), 0)
  }

  return (
    <div>
      <SEO title="Home" />
      <Menu>
        <MenuContainer>Logo</MenuContainer>
      </Menu>
      <ReactFullpage
        {...fullpageProps}
        licenseKey = {'***'}
        navigation
        anchors={['intro', 'reasonOne', 'reasonTwo']}
        sectionsColor={['#4e5c9e', '#d3d7f2', '#F5F5F6']}
        render={({ state, fullpageApi }) => (
          <div id="fullpage-wrapper">
            <div className="section section1 light">
              <SlideWrapper>
                <TextBlock>
                  <SlideHeader>Header 1</SlideHeader>
                  <SlideDescription>Description text 1</SlideDescription>
                </TextBlock>
                <AnimationBlock>
                  {shown ? <Anim1/> : null}
                  <button onClick={handlePlay}>Play</button>
                </AnimationBlock>
              </SlideWrapper>
            </div>
            <div className="section section2">
              <SlideWrapper>
                <AnimationBlock>
                  <Anim2/>
                </AnimationBlock>
                <TextBlock>
                <SlideHeader>Header 2</SlideHeader>
                <SlideDescription>>Description text 2</SlideDescription>
              </TextBlock>
            </SlideWrapper>
          </div>
        </div>
      )}
    />
  </div>
  )
}

【讨论】:

  • 谢谢你!但是,当我尝试在渲染中调用 App() 函数时,出现以下错误:错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本同一个应用
  • App也是一个组件!它只是为了演示。您可以像 &lt;App/&gt; 一样实例化它。
  • 从你的问题中考虑它是FullpageWrapper
  • 啊,你是对的!它现在显示“重置”链接并在点击时重新启动动画。但是有没有办法在 fullPage 状态更改时调用该函数?以下是我如何在 fullPage 状态下触发 console.log 功能:render={({ state, fullpageApi }) =&gt; { console.log("render prop change", state);
  • 好的,所以渲染函数不应该执行状态更新。查看库有一个名为 onLeave&lt;ReactFullpage&gt; 道具,它以回调作为参数。所以它会是onLeave={handlePlay} on &lt;ReactFullPage&gt;
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2017-12-23
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多