【问题标题】:Use a variable inside a render of react native在 react native 的渲染中使用变量
【发布时间】:2020-08-01 18:52:51
【问题描述】:

我需要使用 json 中的 url 并将其呈现在屏幕上,使用 React Native 和 axios。 我得到了这个网址:

teste() {

        api.get('photos').then(

            function imagens(response) {
                var i = 1;           
                for (i; i < 2; i++) {
                    urlDaImagem = response.data[i].url
                    console.log('em cima->' + urlDaImagem)
                }
                return urlDaImagem
            })

    }

我需要将“urlDaImagem”放在 Image 组件中。 整个代码:

    import React from 'react';

import {
    SafeAreaView,
    StyleSheet,
    ScrollView,
    View,
    Image,
    StatusBar
} from 'react-native';

import api from '../api';

var urlDaImagem

class PaginaPrincipal extends React.Component {

    teste() {

        api.get('photos').then(

            function imagens(response) {
                var i = 1;           
                for (i; i < 2; i++) {
                    urlDaImagem = response.data[i].url
                    console.log('em cima->' + urlDaImagem)
                }
                return urlDaImagem
            })

    }

    render() {   

        return (
        
            <>
                <StatusBar barStyle="dark-content" />
                <SafeAreaView>
                    <ScrollView contentInsetAdjustmentBehavior="automatic">
                        <View style={styles.sideBySideImages}>
                            <Image style={styles.imagens} source={{ uri: urlDaImagem }} />

                        </View>
                    </ScrollView>
                </SafeAreaView>
            </>
        )
    }
}


const styles = StyleSheet.create({
    imagens: {
        width: "45%",
        height: 183,
        marginBottom: 5,
        marginTop: 5,
        marginStart: "3%",
        marginEnd: "1%"
    },
    sideBySideImages: {
        flex: 1,
        flexDirection: 'row',
        flexWrap: 'wrap'
    }
});

export default PaginaPrincipal;

【问题讨论】:

  • 在这种情况下如何使用状态?
  • 你能推荐我怎么做吗?在这个案例中
  • 基本上你所要做的就是在状态对象中添加 urlDaImagem 的初始值,然后在 imagens 函数中你可以使用 setstate 来更新 urlDaImagem 的值。
  • teste() 函数什么时候调用?无论是点击任何 touchable 还是 componentDidMount,在这两种情况下都必须使用 state,将更新后的 url 保存在 state 和 render() 方法中,您可以使用它

标签: javascript react-native axios


【解决方案1】:

要从 API 加载数据,最好使用 useEffect 钩子(React native 支持它): https://reactjs.org/docs/hooks-effect.html#explanation-why-effects-run-on-each-update

此外,要正常工作的 React 应该控制组件的状态。例如,您必须通过 useState 钩子声明状态。没有技巧,全局变量将无法工作)

function PaginaPrincipal(props) {
  const [urlDaImagem, setUrlDaImagem] = useState();
  useEffect(
    () => {
      api.get('photos').then(({ data }) => {
        console.log(data);
        const [{ url }] = data;
        setUrlDaImagem(url);
      });
    },
    [] // Effect does not depend on any props
  );
  return (
    <>
      ...
      <Image style={styles.imagens} source={{ uri: urlDaImagem }} />
      ...
    </>
  );
}

【讨论】:

    【解决方案2】:

    你可以在你的情况下使用状态,从这里阅读它:https://reactjs.org/docs/state-and-lifecycle.html

    我更新了你的代码尝试测试它,并查看调用 teste 函数的最佳生命周期,这应该可以解决问题

    import React from 'react';
    import {
        SafeAreaView,
        StyleSheet,
        ScrollView,
        View,
        Image,
        StatusBar
    } from 'react-native';
    
    import api from '../api';
    
    
    class PaginaPrincipal extends React.Component {
        state={
               urlDaImagem:""
              }
        teste() {
    
            api.get('photos').then(
    
                function imagens(response) {
                    var i = 1;
                    let urlDaImagem;
                    for (i; i < 2; i++) {
                        urlDaImagem = response.data[i].url
                        console.log('em cima->' + urlDaImagem)
                    }
                    this.setState({urlDaImagem})
                })
    
        }
    
        render() {   
    
            return (
            
                <>
                    <StatusBar barStyle="dark-content" />
    { this.state.urlDaImagem && 
                    <SafeAreaView>
                        <ScrollView contentInsetAdjustmentBehavior="automatic">
                            <View style={styles.sideBySideImages}>
                               <Image style={styles.imagens} source={{ uri: this.state.urlDaImagem }} /> 
    
                            </View>
                        </ScrollView>
                    </SafeAreaView>
    }
                </>
            )
        }
    }
    
    
    const styles = StyleSheet.create({
        imagens: {
            width: "45%",
            height: 183,
            marginBottom: 5,
            marginTop: 5,
            marginStart: "3%",
            marginEnd: "1%"
        },
        sideBySideImages: {
            flex: 1,
            flexDirection: 'row',
            flexWrap: 'wrap'
        }
    });
    
    export default PaginaPrincipal;
    

    【讨论】:

    • 它给了我以下错误:source.uri 不应该是一个空字符串
    • 添加一个三元 if 语句,以便在从服务器获取 uri 后立即渲染图像
    • 试一试,让我知道它是否有效,如果您发现答案有用,请投票或标记为已解决
    • 我不知道该怎么做,如果你能帮助我,我会非常非常高兴
    • 现在出现以下错误:错误:文本字符串必须在 组件中呈现。
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2021-04-25
    • 2023-01-04
    • 2022-01-02
    • 2019-08-14
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多