React Native: Bagaimana memilih TextInput berikutnya setelah menekan tombol keyboard "next"?

201

Saya mendefinisikan dua bidang TextInput sebagai berikut:

<TextInput 
   style = {styles.titleInput}
   returnKeyType = {"next"}
   autoFocus = {true}
   placeholder = "Title" />
<TextInput
   style = {styles.descriptionInput}          
   multiline = {true}
   maxLength = {200}
   placeholder = "Description" />

Tetapi setelah menekan tombol "berikutnya" pada keyboard saya, aplikasi asli-reaksi saya tidak melompat ke bidang TextInput kedua. Bagaimana saya bisa mencapainya?

Terima kasih!

andreaswiena
sumber
Jawaban Mitch (saat ini yang ke-3 ke bawah) bekerja untuk saya di v0.42.
lawrence
Untuk orang-orang di Bereaksi v16.8.0atau di atas, saya akan merekomendasikan jawaban yang diberikan oleh @Eli Johnson di bagian bawah. Bereaksi telah meninggalkan banyak kegunaan dari refsolusi yang disediakan di bawah ini.
thedeg123

Jawaban:

331

Set kedua TextInputfokus, ketika sebelumnya TextInput's onSubmitEditingdipicu.

Coba ini

  1. Menambahkan Ref ke TextInput kedua
    ref={(input) => { this.secondTextInput = input; }}

  2. Bind fungsi fokus untuk acara onSubmitEditing TextInput pertama .
    onSubmitEditing={() => { this.secondTextInput.focus(); }}

  3. Ingatlah untuk mengatur blurOnSubmit ke false, untuk mencegah papan ketik berkedip-kedip.
    blurOnSubmit={false}

Ketika semua selesai, akan terlihat seperti ini.

<TextInput
    placeholder="FirstTextInput"
    returnKeyType="next"
    onSubmitEditing={() => { this.secondTextInput.focus(); }}
    blurOnSubmit={false}
/>

<TextInput
    ref={(input) => { this.secondTextInput = input; }}
    placeholder="secondTextInput"
/>
kebosanan
sumber
53
Layak untuk disebutkan, onSubmitEditingpanggilan balik itu dipanggil setelah bluracara. Jadi keyboard mungkin menjadi gila jika segera fokus pada elemen berikutnya. Jadi mungkin membantu untuk mengatur blurOnSubmit={false}ke semua elemen dalam bentuk tetapi biarkan truepada elemen terakhir, untuk memungkinkan tombol Selesai mengaburkan input terakhir.
e1dar
9
Ini tidak berfungsi lagi, pada v0.36. Tidak ada metode "fokus" pada komponen. Bagaimana seharusnya kita melakukan ini sekarang?
Mitch
4
@Mitch berfungsi dengan baik pada 0.40.0. Mungkin ada bug di versi yang Anda jalankan.
vikki
3
Menggunakan RN 0.49, menambah blurOnSubmit={false}untuk mencegah kerlip keyboard menyebabkan ini berhenti bekerja, ada yang tahu apa yang terjadi?
nabil london
13
Bagi siapa pun yang tidak bisa membuat focuspekerjaan, pastikan Anda tidak menggunakan pembungkus untuk TextInputkomponen. Jika Anda memiliki CustomTextInputkomponen yang membungkus TextInput, Anda perlu menerapkan TextInputmetode blur dan fokus untuk komponen itu sehingga akan berfungsi seperti yang diharapkan.
Cihad Turhan
65

Anda dapat melakukan ini tanpa menggunakan referensi . Pendekatan ini lebih disukai, karena referensi dapat menyebabkan kode rapuh . The Bereaksi docs menyarankan menemukan solusi lain jika mungkin:

Jika Anda belum memprogram beberapa aplikasi dengan Bereaksi, kecenderungan pertama Anda biasanya adalah mencoba menggunakan referensi untuk "mewujudkan sesuatu" di aplikasi Anda. Jika ini masalahnya, luangkan waktu sejenak dan pikirkan lebih kritis tentang di mana negara harus dimiliki dalam hierarki komponen. Seringkali, menjadi jelas bahwa tempat yang tepat untuk "memiliki" keadaan itu berada pada tingkat yang lebih tinggi dalam hierarki. Menempatkan keadaan di sana sering menghilangkan keinginan untuk menggunakan referensi untuk "mewujudkan sesuatu" - sebagai gantinya, aliran data biasanya akan mencapai tujuan Anda.

Sebagai gantinya, kami akan menggunakan variabel status untuk memfokuskan bidang input kedua.

  1. Tambahkan variabel status yang akan kami sampaikan sebagai penyangga ke DescriptionInput:

    initialState() {
      return {
        focusDescriptionInput: false,
      };
    }
  2. Tetapkan metode handler yang akan mengatur variabel status ini menjadi true:

    handleTitleInputSubmit() {
      this.setState(focusDescriptionInput: true);
    }
  3. Setelah memasukkan / menekan enter / selanjutnya pada TitleInput, kami akan menelepon handleTitleInputSubmit. Ini akan focusDescriptionInputmenjadi true.

    <TextInput 
       style = {styles.titleInput}
       returnKeyType = {"next"}
       autoFocus = {true}
       placeholder = "Title" 
       onSubmitEditing={this.handleTitleInputSubmit}
    />
  4. DescriptionInput's focusprop diatur untuk kami focusDescriptionInputvariabel negara. Jadi, ketika focusDescriptionInputperubahan (dalam langkah 3), DescriptionInputakan dirender ulang focus={true}.

    <TextInput
       style = {styles.descriptionInput}          
       multiline = {true}
       maxLength = {200}
       placeholder = "Description" 
       focus={this.state.focusDescriptionInput}
    />

Ini adalah cara yang bagus untuk menghindari penggunaan referensi, karena referensi dapat menyebabkan kode yang lebih rapuh :)

EDIT: h / t ke @LaneRettig untuk menunjukkan bahwa Anda harus membungkus React Native TextInput dengan beberapa alat peraga tambahan & metode untuk membuatnya merespons focus:

    // Props:
    static propTypes = { 
        focus: PropTypes.bool,
    } 

    static defaultProps = { 
        focus: false,
    } 

    // Methods:
    focus() {
        this._component.focus(); 
    } 

    componentWillReceiveProps(nextProps) {
        const {focus} = nextProps; 

        focus && this.focus(); 
    }
Stedman Blake
sumber
2
@LaneRettig Anda sepenuhnya benar - terima kasih telah menunjukkannya. Kami membungkus RN TextInput dengan beberapa alat peraga dan metode tambahan - silakan lihat bagian bawah jawaban dengan penambahan itu dan beri tahu saya jika Anda memiliki masalah lebih lanjut!
Stedman Blake
4
Keren. Anda harus mengirimkan ini sebagai PR ke RN. Saya terkejut ini belum didukung di luar kotak.
Lane Rettig
8
bagaimana jika Anda klik berikutnya pada keyboard, dan kemudian klik langsung pada input pertama? fokus kembali ke posisi kedua yang merupakan pengalaman buruk dengan solusi itu
Piotr
3
Saya tidak suka solusi ini, khususnya karena tidak skala baik untuk bentuk 5-6 elemen yang sedikit lebih lama, di mana Anda akan memerlukan boolean fokus dalam keadaan untuk setiap elemen & mengatur semuanya sesuai.
davidgoli
9
Menariknya, dokumen juga menyatakan: "Ada beberapa kasus penggunaan yang baik untuk referensi: Mengelola fokus, pemilihan teks, atau pemutaran media ..." Jadi dalam hal ini, menggunakan referensi untuk memfokuskan input teks akan menjadi penggunaan alat yang valid. .
Noah Allen
26

Pada Bereaksi Asli 0,36, panggilan focus()(seperti yang disarankan dalam beberapa jawaban lain) pada simpul input teks tidak didukung lagi. Sebagai gantinya, Anda dapat menggunakan TextInputStatemodul dari React Native. Saya membuat modul pembantu berikut untuk mempermudah ini:

// TextInputManager
//
// Provides helper functions for managing the focus state of text
// inputs. This is a hack! You are supposed to be able to call
// "focus()" directly on TextInput nodes, but that doesn't seem
// to be working as of ReactNative 0.36
//
import { findNodeHandle } from 'react-native'
import TextInputState from 'react-native/lib/TextInputState'


export function focusTextInput(node) {
  try {
    TextInputState.focusTextInput(findNodeHandle(node))
  } catch(e) {
    console.log("Couldn't focus text input: ", e.message)
  }
}

Anda dapat, kemudian, memanggil focusTextInputfungsi pada "ref" a TextInput. Sebagai contoh:

...
<TextInput onSubmit={() => focusTextInput(this.refs.inputB)} />
<TextInput ref="inputB" />
...
Mitch
sumber
1
Bekerja luar biasa tetapi jika ada yang menggunakan redux-form harus melakukan sesuatu seperti ini. <Field ... onSubmitEditing={() => focusTextInput(this._password)} />dan ref harus seperti ini<Field ... withRef refName={e => this._password = e}/>
tarkanlar
1
Saya harus menggunakan 'onSubmitEditing' untuk membuat pekerjaan ini tetapi solusi yang bagus.
Adam Jakiela
3
Berfungsi bagus di 0,42.
lawrence
1
@tarkanlar dapatkah Anda membagikan cuplikan kode untuk solusinya? Sepertinya saya tidak bisa fokus ketika menggunakan redux-form Field, hanya menggunakan TextInput works, fine
jasan
2
calling focus() on a text input node isn't supported any more=> klaim berani, sumber? Memanggil focus()berfungsi dengan baik dengan v0.49.5 + TextInputStatetidak didokumentasikan sementara focus()dan blur()disebutkan: facebook.github.io/react-native/releases/next/docs/…
tanguy_k
21

Saya membuat perpustakaan kecil yang melakukan ini, tidak diperlukan perubahan kode selain mengganti tampilan pembungkus Anda dan mengimpor TextInput:

import { Form, TextInput } from 'react-native-autofocus'

export default () => (
  <Form>
    <TextInput placeholder="test" />
    <TextInput placeholder="test 2" />
  </Form>
)

https://github.com/zackify/react-native-autofocus

Dijelaskan secara terperinci di sini: https://zach.codes/autofocus-inputs-in-react-native/

zackify
sumber
Pola yang sangat baik untuk mencapai hasil ini. Harus menjadi jawaban teratas dari kemudahan penggunaan titik berdiri. Sepertinya saya dapat dengan mudah mengedit FormInput khusus saya (ekstensi TextInput) agar tetap berfungsi dengan input Formulir Anda. Keberatan jika saya memasukkannya ke jawaban Anda jika untuk contoh lebih lanjut?
Jack Robson
Tentu! Saya tahu ... Saya memposting ini pada posting populer lainnya tentang ini tetapi mendapat masalah untuk duplikat. Hanya berusaha membantu karena saya tahu betapa menjengkelkannya masalah ini !!
zackify
Ini bagus jika Anda memiliki banyak TextInputs tepat setelah satu sama lain tetapi jika Anda ingin menambahkan gaya di antara mereka itu rusak. Terima kasih atas kontribusinya.
GenericJam
Jangan ragu untuk menyesuaikan kode. Saya yakin Anda bisa membuat cara yang akan melewatkan elemen yang bukan input teks. Seharusnya tidak terlalu sulit untuk dilakukan.
zackify
1
Ini tidak dibuat untuk produksi [email protected]
Phil Andrews
18

Saya pikir saya akan membagikan solusi saya menggunakan komponen fungsi ... ' ini ' tidak diperlukan!

Bereaksi 16.12.0 dan Bereaksi Asli 0.61.5

Berikut adalah contoh komponen saya:

import React, { useRef } from 'react'
...


const MyFormComponent = () => {

  const ref_input2 = useRef();
  const ref_input3 = useRef();

  return (
    <>
      <TextInput
        placeholder="Input1"
        autoFocus={true}
        returnKeyType="next"
        onSubmitEditing={() => ref_input2.current.focus()}
      />
      <TextInput
        placeholder="Input2"
        returnKeyType="next"
        onSubmitEditing={() => ref_input3.current.focus()}
        ref={ref_input2}
      />
      <TextInput
        placeholder="Input3"
        ref={ref_input3}
      />
    </>
  )
}

Saya tidak tahu, harap ini membantu seseorang =)

Eli Johnson
sumber
1
tidak bekerja undefined bukan objek yang mengevaluasi _this2.ref_input2.current, tolong bantu
DEEP ADHIYA
Bisakah Anda memberikan contoh kode yang lebih lengkap?
Eli Johnson
2
mungkin lebih baik menggunakan useRef dalam komponen fungsional daripada createRef
hyuk lee
@hyuklee Anda memang benar Pak, saya telah memperbarui ... terima kasih untuk semua yang sudah ada! Bersulang!
Eli Johnson
Bagi mereka yang suka mengikuti pembaruan reaksi terbaru, ini THE JAWABAN.
Yokhen
13

Menggunakan react-asli 0.45.1 Saya juga mengalami masalah mencoba mengatur fokus pada kata sandi TextInput setelah menekan tombol kembali pada nama pengguna TextInput.

Setelah mencoba sebagian besar solusi berperingkat teratas di SO, saya menemukan solusi pada github yang memenuhi kebutuhan saya: https://github.com/shoutem/ui/issues/44#issuecomment-290724642

Singkatnya:

import React, { Component } from 'react';
import { TextInput as RNTextInput } from 'react-native';

export default class TextInput extends Component {
    render() {
        const { props } = this;

        return (
            <RNTextInput
                {...props}
                ref={(input) => props.inputRef && props.inputRef(input)}
            />
        );
    }
}

Dan kemudian saya menggunakannya seperti ini:

import React, {Component} from 'react';
import {
    View,
} from 'react-native';
import TextInput from "../../components/TextInput";

class Login extends Component {
    constructor(props) {
        super(props);
        this.passTextInput = null
    }

    render() {
        return (
            <View style={{flex:1}}>
                <TextInput
                    style={{flex:1}}
                    placeholder="Username"
                    onSubmitEditing={(event) => {
                        this.passTextInput.focus()
                    }}
                />

                <TextInput
                    style={{flex:1}}
                    placeholder="Password"
                    inputRef={(input) => {
                        this.passTextInput = input
                    }}
                />
            </View>
        )
    }
}
kuhr
sumber
Anda menyelamatkan hidup saya
:)
1
Anda baru saja berganti nama refmenjadi inputRef... Anda dapat menjatuhkan seluruh komponen khusus Anda dan blok kode kedua Anda akan berfungsi apa adanya selama Anda kembali menggunakanref
Jason Tolliver
9

Bagi saya di RN 0,50.3 itu mungkin dengan cara ini:

<TextInput 
  autoFocus={true} 
  onSubmitEditing={() => {this.PasswordInputRef._root.focus()}} 
/>

<TextInput ref={input => {this.PasswordInputRef = input}} />

Anda harus melihat ini.PasswordInputRef. _root .fokus ()

Wishmaster
sumber
1
Ini khusus 'basis asli'
Developia
8

Jika Anda menggunakan tcomb-form-nativeseperti saya, Anda dapat melakukan ini juga. Begini TextInputcaranya : alih-alih mengatur alat peraga secara langsung, Anda melakukannya melalui options. Anda bisa merujuk ke bidang formulir sebagai:

this.refs.form.getComponent('password').refs.input.focus()

Jadi produk akhir terlihat seperti ini:

var t = require('tcomb-form-native');
var Form = t.form.Form;

var MyForm = t.struct({
  field1:     t.String,
  field2:     t.String,
});

var MyComponent = React.createClass({

  _getFormOptions () {
    return {
      fields: {
        field1: {
          returnKeyType: 'next',
          onSubmitEditing: () => {this.refs.form.getComponent('field2').refs.input.focus()},
        },
      },
    };
  },

  render () {

    var formOptions = this._getFormOptions();

    return (
      <View style={styles.container}>
        <Form ref="form" type={MyForm} options={formOptions}/>
      </View>
    );
  },
});

(Kredit untuk remcoanker untuk memposting ide di sini: https://github.com/gcanti/tcomb-form-native/issues/96 )

Lane Rettig
sumber
bagaimana cara memanggil fungsi onSubmitEditing? sebagai contoh: Saya ingin memanggil fungsi login () ketika pengguna menekan kembali jenis input teks terakhir 'selesai'.
chetan
7

Inilah cara saya mencapainya. Dan contoh di bawah ini telah menggunakan API React.createRef () yang diperkenalkan di Bereaksi 16.3.

class Test extends React.Component {
  constructor(props) {
    super(props);
    this.secondTextInputRef = React.createRef();
  }

  render() {
    return(
        <View>
            <TextInput
                placeholder = "FirstTextInput"
                returnKeyType="next"
                onSubmitEditing={() => { this.secondTextInputRef.current.focus(); }}
            />
            <TextInput
                ref={this.secondTextInputRef}
                placeholder = "secondTextInput"
            />
        </View>
    );
  }
}

Saya pikir ini akan membantu Anda.

Janaka Pushpakumara
sumber
apa tujuan dari .current?
Adam Katz
5

Skenario saya adalah <CustomBoladonesTextInput /> membungkus RN <TextInput /> .

Saya memecahkan masalah ini sebagai berikut:

Bentuk saya seperti:

  <CustomBoladonesTextInput 
      onSubmitEditing={() => this.customInput2.refs.innerTextInput2.focus()}
      returnKeyType="next"
      ... />

  <CustomBoladonesTextInput 
       ref={ref => this.customInput2 = ref}
       refInner="innerTextInput2"
       ... />

Pada definisi komponen CustomBoladonesTextInput, saya meneruskan refField ke prop ref dalam seperti ini:

   export default class CustomBoladonesTextInput extends React.Component {
      render() {        
         return (< TextInput ref={this.props.refInner} ... />);     
      } 
   }

Dan voila. Semuanya kembali berfungsi lagi. Semoga ini membantu

Rodrigo Tessarollo
sumber
4

Coba solusi ini pada masalah React Native's GitHub.

https://github.com/facebook/react-native/pull/2149#issuecomment-129262565

Anda perlu menggunakan penyangga ref untuk komponen TextInput.
Maka Anda perlu membuat fungsi yang dipanggil pada prop onSubmitEditing yang memindahkan fokus pada ref TextInput kedua.

var InputScreen = React.createClass({
    _focusNextField(nextField) {
        this.refs[nextField].focus()
    },

    render: function() {
        return (
            <View style={styles.container}>
                <TextInput
                    ref='1'
                    style={styles.input}
                    placeholder='Normal'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('2')}
                />
                <TextInput
                    ref='2'
                    style={styles.input}
                    keyboardType='email-address'
                    placeholder='Email Address'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('3')}
                />
                <TextInput
                    ref='3'
                    style={styles.input}
                    keyboardType='url'
                    placeholder='URL'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('4')}
                />
                <TextInput
                    ref='4'
                    style={styles.input}
                    keyboardType='numeric'
                    placeholder='Numeric'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('5')}
                />
                <TextInput
                    ref='5'
                    style={styles.input}
                    keyboardType='numbers-and-punctuation'
                    placeholder='Numbers & Punctuation'
                    returnKeyType='done'
                />
            </View>
        );
    }
});
APAquino
sumber
Harap sertakan informasi relatif dari tautan dalam jawaban Anda.
Wes Foster
Perlu diingat bahwa string ref mungkin menjadi usang sehingga solusi ini mungkin tidak berfungsi di masa depan: "... Meskipun string ref tidak ditinggalkan, mereka dianggap warisan, dan kemungkinan akan ditinggalkan pada beberapa titik di masa mendatang. Callback ref adalah lebih disukai. " - facebook.github.io/react/docs/more-about-refs.html
yura
1
Ini tidak berfungsi lagi, pada v0.36. Tidak ada metode "fokus" pada komponen. Bagaimana seharusnya kita melakukan ini sekarang? Bisakah Anda memperbarui jawabannya?
Mitch
@ Nyalakan tidak yakin apakah ini kembali pada 0.39.2 tetapi ini berfungsi dengan baik sekarang.
Eldelshell
4

Menggunakan referensi panggil balik alih-alih referensi string lama :

<TextInput
    style = {styles.titleInput}
    returnKeyType = {"next"}
    autoFocus = {true}
    placeholder = "Title"
    onSubmitEditing={() => {this.nextInput.focus()}}
/>
<TextInput
    style = {styles.descriptionInput}  
    multiline = {true}
    maxLength = {200}
    placeholder = "Description"
    ref={nextInput => this.nextInput = nextInput}
/>
fagerbua
sumber
1
Tidak berfungsi karena metode fokus telah dihapus dari TextInput.
Jacob Lauritzen
3
<TextInput 
    keyboardType="email-address"
    placeholder="Email"
    returnKeyType="next"
    ref="email"
    onSubmitEditing={() => this.focusTextInput(this.refs.password)}
    blurOnSubmit={false}
 />
<TextInput
    ref="password"
    placeholder="Password" 
    secureTextEntry={true} />

Dan tambahkan metode untuk onSubmitEditing={() => this.focusTextInput(this.refs.password)}seperti di bawah ini:

private focusTextInput(node: any) {
    node.focus();
}
Nisar
sumber
2

Agar solusi yang diterima berfungsi jika Anda TextInputberada di dalam komponen lain, Anda harus "memunculkan" referensi dari refke wadah induk.

// MyComponent
render() {
    <View>
        <TextInput ref={(r) => this.props.onRef(r)} { ...this.props }/>
    </View>
}

// MyView
render() {
    <MyComponent onSubmitEditing={(evt) => this.myField2.focus()}/>
    <MyComponent onRef={(r) => this.myField2 = r}/>
}
Eldelshell
sumber
1
Hai @ Elldell, saya ingin mencapai hal yang sama, tetapi tidak bisa memilah sampel Anda, maukah Anda menunjukkan petunjuk kepada kami?
Seeliang
Saya pikir ini harus menjadi jawaban yang benar. Saya mengikuti ini dan itu berhasil.
David Cheung
apakah ini keduanya dalam file yang sama?
MoralCode
2

dalam komponen Anda:

constructor(props) {
        super(props);
        this.focusNextField = this
            .focusNextField
            .bind(this);
        // to store our input refs
        this.inputs = {};
    }
    focusNextField(id) {
        console.log("focus next input: " + id);
        this
            .inputs[id]
            ._root
            .focus();
    }

Catatan: Saya menggunakan ._rootkarena ini adalah referensi ke TextInput di NativeBase'Library 'Input

dan dalam input teks Anda seperti ini

<TextInput
         onSubmitEditing={() => {
                          this.focusNextField('two');
                          }}
         returnKeyType="next"
         blurOnSubmit={false}/>


<TextInput      
         ref={input => {
              this.inputs['two'] = input;
                        }}/>
amorenew
sumber
2
<TextInput placeholder="Nombre"
    ref="1"
    editable={true}
    returnKeyType="next"
    underlineColorAndroid={'#4DB6AC'}
    blurOnSubmit={false}
    value={this.state.First_Name}
    onChangeText={First_Name => this.setState({ First_Name })}
    onSubmitEditing={() => this.focusNextField('2')}
    placeholderTextColor="#797a7a" style={{ marginBottom: 10, color: '#808080', fontSize: 15, width: '100%', }} />

<TextInput placeholder="Apellido"
    ref="2"
    editable={true}
    returnKeyType="next"
    underlineColorAndroid={'#4DB6AC'}
    blurOnSubmit={false}
    value={this.state.Last_Name}
    onChangeText={Last_Name => this.setState({ Last_Name })}
    onSubmitEditing={() => this.focusNextField('3')}
    placeholderTextColor="#797a7a" style={{ marginBottom: 10, color: '#808080', fontSize: 15, width: '100%', }} />

dan tambahkan metode

focusNextField(nextField) {
    this.refs[nextField].focus();
}
Saloni Parikh
sumber
Pendekatan yang sangat rapi.
Siraj Alam
1
Jawaban lama tetapi apakah ada yang tahu apakah mungkin untuk mengakses semua referensi seperti dalam jawaban ini dalam komponen fungsional (stateless)?
Douglas Schmidt
1

Ada cara untuk menangkap tab di a TextInput. Rampok, tapi lebih baik daripada tidak sama sekali .

Tetapkan onChangeTexthandler yang membandingkan nilai input baru dengan yang lama, memeriksa a\t . Jika ditemukan, lanjutkan bidang seperti yang ditunjukkan oleh @boredgames

Dengan asumsi variabel usernameberisi nilai untuk nama pengguna dan setUsernamemengirimkan tindakan untuk mengubahnya di toko (status komponen, toko redux, dll), lakukan sesuatu seperti ini:

function tabGuard (newValue, oldValue, callback, nextCallback) {
  if (newValue.indexOf('\t') >= 0 && oldValue.indexOf('\t') === -1) {
    callback(oldValue)
    nextCallback()
  } else {
    callback(newValue)
  }
}

class LoginScene {
  focusNextField = (nextField) => {
    this.refs[nextField].focus()
  }

  focusOnPassword = () => {
    this.focusNextField('password')
  }

  handleUsernameChange = (newValue) => {
    const { username } = this.props            // or from wherever
    const { setUsername } = this.props.actions // or from wherever

    tabGuard(newValue, username, setUsername, this.focusOnPassword)
  }

  render () {
    const { username } = this.props

    return (
      <TextInput ref='username'
                 placeholder='Username'
                 autoCapitalize='none'
                 autoCorrect={false}
                 autoFocus
                 keyboardType='email-address'
                 onChangeText={handleUsernameChange}
                 blurOnSubmit={false}
                 onSubmitEditing={focusOnPassword}
                 value={username} />
    )
  }
}
marius
sumber
Ini tidak berfungsi untuk saya menggunakan keyboard fisik. acara onChangeText tidak muncul di tab.
Bufke
0

Di sini solusi reagen untuk komponen input yang memiliki: properti fokus.

Bidang akan difokuskan selama prop ini disetel ke true dan tidak akan memiliki fokus selama ini salah.

Sayangnya komponen ini perlu memiliki: ref didefinisikan, saya tidak dapat menemukan cara lain untuk memanggil .focus () di atasnya. Saya senang dengan saran.

(defn focusable-input [init-attrs]
  (r/create-class
    {:display-name "focusable-input"
     :component-will-receive-props
       (fn [this new-argv]
         (let [ref-c (aget this "refs" (:ref init-attrs))
               focus (:focus (ru/extract-props new-argv))
               is-focused (.isFocused ref-c)]
           (if focus
             (when-not is-focused (.focus ref-c))
             (when is-focused (.blur ref-c)))))
     :reagent-render
       (fn [attrs]
         (let [init-focus (:focus init-attrs)
               auto-focus (or (:auto-focus attrs) init-focus)
               attrs (assoc attrs :auto-focus auto-focus)]
           [input attrs]))}))

https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5

Knotschi
sumber
@Bap - ini adalah Clojurescript. Reagen mengikat untuk Bereaksi. Jika Anda penasaran, ini adalah pertandingan yang bagus untuk Bereaksi jika Anda ingin melakukan sesuatu karena pembaruan stateful umumnya hanya mungkin dengan hal-hal seperti panggilan eksplisit untuk swap!suatu atomjenis. Sesuai dokumen, ini digunakan untuk mengikat React: "Setiap komponen yang menggunakan atom secara otomatis dirender ketika nilainya berubah." reagent-project.github.io
Del
0

Jika Anda menggunakan NativeBase sebagai Komponen UI, Anda dapat menggunakan sampel ini

<Item floatingLabel>
    <Label>Title</Label>
    <Input
        returnKeyType = {"next"}
        autoFocus = {true}
        onSubmitEditing={(event) => {
            this._inputDesc._root.focus(); 
        }} />
</Item>
<Item floatingLabel>
    <Label>Description</Label>
    <Input
        getRef={(c) => this._inputDesc = c}
        multiline={true} style={{height: 100}} />
        onSubmitEditing={(event) => { this._inputLink._root.focus(); }} />
</Item>
Mohamed Ben Hartouz
sumber