开发者问题收集

显示文本而不是控制台日志

2020-06-05
1046

我想在文本组件中显示文本,而不是在控制台中记录它。我已经在函数中获取了信息,现在它只是在控制台中记录它。我想从函数中获取信息并将其放入状态中,然后通过从状态中抓取它来显示它。

state = {
    displayName: firebase.auth().currentUser.displayName,
    email: firebase.auth().currentUser.email,
    familyName: this.getFamilyName(),
  };

  getFamilyName() {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then(function (doc) {
        if (doc.exists) {
          console.log(doc.data().familyname);
          return doc.data().familyname;
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      });
  }

  render() {
    return (
      <ScrollView>
        <View>
          <ThemeProvider>
            <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
              FAMILIE
            </Text>
            <Text h2 style={{ textAlign: "center", top: 20 }}>
              {this.state.familyName}
            </Text>

更新。它似乎没有转移到状态。当我在控制台中记录状态时,它显示未定义。:

state = {
    displayName: firebase.auth().currentUser.displayName,
    email: firebase.auth().currentUser.email,
    familyName: this.getFamilyName(),
  };

  getFamilyName() {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then(function (doc) {
        if (doc.exists) {
          console.log("1st" + doc.data().familyname);
          const name = doc.data().familyname;
          this.setState({ familyName: name });
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      });
  }

  render() {
    console.log("2nd" + this.state.familyName);
    return (
      <ScrollView>
        <View>
          <ThemeProvider>
            <View>
              <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
                FAMILIE
              </Text>
              <Text h2 style={{ textAlign: "center", top: 20 }}>
                {this.state.familyName}
              </Text>
            </View>

输出

2ndundefined
1stVilholm
Error getting document: [TypeError: undefined is not an object (evaluating 'this.setState')]
3个回答

您可以 setState familyName

if (doc.exists) {
          console.log(doc.data().familyname);
          this.setState({'familyName':doc.data().familyname})
        }

现在 Text 组件会向您显示 familyName

<Text h2 style={{ textAlign: "center", top: 20 }}>
          {this.state.familyName&&this.state.familyName}
      </Text>

或者

<Text h2 style={{ textAlign: "center", top: 20 }}>
          {this.state?.familyName}
      </Text>

将您的函数编写为箭头函数

getFamilyName=()=> {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then((doc)=> {
        if (doc.exists) {
          console.log("1st" + doc.data().familyname);
          const name = doc.data().familyname;
          this.setState({ familyName: name });
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      })}
Dipesh KC
2020-06-05

不要使用 firebase 设置初始状态,而是将其初始化为默认值,然后在检索信息时只缺少 setState,只需执行以下操作:

state = {
    displayName: firebase.auth().currentUser.displayName,
    email: firebase.auth().currentUser.email,
    familyName: '',
  };

  getFamilyName() {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then(function (doc) {
        if (doc.exists) {
          console.log(doc.data().familyname);

          const name = doc.data().familyname;
          this.setState({ familyName: name )}

      } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      });
  }

  render() {
    return (
      <ScrollView>
        <View>
          <ThemeProvider>
            <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
              FAMILIE
            </Text>
            <Text h2 style={{ textAlign: "center", top: 20 }}>
              {this.state.familyName}
            </Text>

如果您想在 doc 不存在时处理错误,您可以执行以下操作:

} else {
          // doc.data() will be undefined in this case
          this.setState({familyName: false})
        }
      })

然后在渲染函数中处理 familyName 的值(可能使用三元运算符)

iba
2020-06-05

使用生命周期方法 componentDidMount()。将初始状态定义为空字符串。

state = {
    displayName: '',
    email: '',
    familyName: '',
  };

componentDidMount() {
    this.setState({familyName : firebase.auth().currentUser.displayName })
    this.setState({familyName : firebase.auth().currentUser.email })
    this.setState({familyName : this.getFamilyName() })
}

如果您想在其他地方设置状态,您可以将字段更新为

this.setState( { familyName : "Your String" } )

您可以在 Text 标签内将状态变量用作 {this.state.familyName} 来呈现视图。请注意,更改状态变量将自动重新呈现组件。

edison16029
2020-06-05