Reactjs setState () với tên khóa động?


248

EDIT: đây là một bản sao, xem tại đây

Tôi không thể tìm thấy bất kỳ ví dụ nào về việc sử dụng tên khóa động khi đặt trạng thái. Đây là những gì tôi muốn làm:

inputChangeHandler : function (event) {
    this.setState( { event.target.id  : event.target.value } );
},

trong đó event.target.id được sử dụng làm khóa trạng thái được cập nhật. Điều này là không thể trong React?


4
Đây là một bản sao của bất kỳ câu hỏi liên quan đến khóa đối tượng động. Nó không cụ thể để phản ứng
Cory Danielson

9
var newstate = {}; newstate [event.target.id] = event.target.id; this .setState (newstate);
Cory Danielson

Cảm ơn bạn, tôi đã không xử lý tốt việc sử dụng các đối tượng nói chung.
trad


@trad Tôi gặp vấn đề này, nhưng bạn đã đặt gì vào Trạng thái ban đầu của mình? Nó không thành vấn đề, phải không?
Raphael Onofre

Câu trả lời:


280

Nhờ gợi ý của @ Cory, tôi đã sử dụng:

inputChangeHandler : function (event) {
    var stateObject = function() {
      returnObj = {};
      returnObj[this.target.id] = this.target.value;
         return returnObj;
    }.bind(event)();

    this.setState( stateObject );    
},

Nếu sử dụng ES6 hoặc bộ chuyển mã Babel để chuyển đổi mã JSX của bạn, bạn cũng có thể thực hiện việc này với các tên thuộc tính được tính toán :

inputChangeHandler : function (event) {
    this.setState({ [event.target.id]: event.target.value });
    // alternatively using template strings for strings
    // this.setState({ [`key${event.target.id}`]: event.target.value });
}

27
Ngoài ra còn có một cú pháp mới cho điều này, nếu bạn đang sử dụng bablejs để xây dựng mã của mình. Bạn có thể sử dụngcomputed property names
Cory Danielson

Cách tiếp cận thứ hai gây ra lỗi cú pháp trong các trình duyệt trên WIndows (IE, Chrome). Có ai để ý không?
benjaminz

Làm thế nào để có được nêu?
Muneem Habib

Cảm ơn trad, đây là những gì tôi đang tìm kiếm để tránh trùng lặp mã để <Radio />thực hiện.
Adesh M

6
Nếu bạn đặt trạng thái bằng tên thuộc tính được tính như thế này: this.setState({ [event.target.id]: event.target.value });thì bạn sẽ truy cập trạng thái đó bằng cách sử dụng this.state......như thế nào?
dùng3574492

142

Khi bạn cần xử lý nhiều yếu tố đầu vào được kiểm soát, bạn có thể thêm thuộc tính name cho từng thành phần và để chức năng xử lý chọn việc cần làm dựa trên giá trị của event.target.name.

Ví dụ:

inputChangeHandler(event) {
  this.setState({ [event.target.name]: event.target.value });
}


7
dấu ngoặc quanh [event.target.name] biểu thị điều gì? Tại sao họ được yêu cầu?
dùng798719

1
So với cách tiếp cận thông thường để đặt tên riêng cho từng thành phần như this.setState ({userName: e.target.value}); Điều này sẽ xử lý nhiều phần tử của biểu mẫu dưới dạng một mảng và không cần thiết lập từng phần tử riêng lẻ
vikram jeet singh

1
nhưng làm thế nào để tôi truy cập vào trạng thái đó theo cùng một cách? như thế this.state([event.target.name])nào
Kirankumar Dafda

1
Tôi nghĩ rằng các tài liệu web MDNbài đăng này giải thích lý do tại sao chúng ta cần dấu ngoặc.
Kelli

46

Làm thế nào tôi hoàn thành điều này ...

inputChangeHandler: function(event) {
  var key = event.target.id
  var val = event.target.value
  var obj  = {}
  obj[key] = val
  this.setState(obj)
},

Tôi đã làm theo cách tương tự nhưng vấn đề là nó vẫn không kết xuất được thành phần và tôi đã chạy trụ cột để đăng (bao gồm cả điều này: D), và ở đâu đó đã tìm thấy điều này: this.forceUpdate();điều không nên xảy ra với React mới nhất. Chúng ta hãy xem vấn đề sau !!
xploreraj

24

Tôi chỉ muốn thêm, rằng bạn cũng có thể sử dụng cấu trúc lại để cấu trúc lại mã và làm cho nó trông gọn gàng hơn.

inputChangeHandler: function ({ target: { id, value }) {
    this.setState({ [id]: value });
},

10

Trong vòng lặp với .mapcông việc như thế này:

{
    dataForm.map(({ id, placeholder, type }) => {
        return <Input
            value={this.state.type}
            onChangeText={(text) => this.setState({ [type]: text })}
            placeholder={placeholder}
            key={id} />
    })
}

Lưu ý []trong typetham số. Hi vọng điêu nay co ich :)


10

Tôi đã có một vấn đề tương tự.

Tôi muốn đặt trạng thái nơi khóa cấp 2 được lưu trữ trong một biến.

ví dụ this.setState({permissions[perm.code]: e.target.checked})

Tuy nhiên đây không phải là cú pháp hợp lệ.

Tôi đã sử dụng mã sau đây để đạt được điều này:

this.setState({
  permissions: {
    ...this.state.permissions,
    [perm.code]: e.target.checked
  }
});


2

Tôi đang tìm kiếm một giải pháp đẹp và đơn giản và tôi đã tìm thấy điều này:

this.setState({ [`image${i}`]: image })

Hi vọng điêu nay co ich


1
this.setState({ [`${event.target.id}`]: event.target.value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[event.target.id]));
    });

Hãy nhớ các nhân vật trích dẫn.


0

Trạng thái của bạn với từ điển cập nhật một số khóa mà không mất giá trị khác

state = 
{   
    name:"mjpatel"  
    parsedFilter:
    {
      page:2,
      perPage:4,
      totalPages: 50,
    }
}

Giải pháp dưới đây

 let { parsedFilter } = this.state
 this.setState({
      parsedFilter: {
        ...this.state.parsedFilter,
        page: 5
      }
  });

ở đây cập nhật giá trị cho "trang" chính với giá trị 5


-4

Có thể sử dụng cú pháp lây lan, đại loại như thế này:

inputChangeHandler : function (event) {
    this.setState( { 
        ...this.state,
        [event.target.id]: event.target.value
    } );
},

7
React sẽ thực hiện việc hợp nhất đối tượng cho bạn, đây là thực tế tồi.
Rohmer

1
về cơ bản nếu bạn có một số đối tượng bên trong và bạn muốn thay đổi một đối tượng phù hợp với đối tượng bên trong đó, bạn sẽ làm như thế này: this.setState ({chọnItems: {... chọnItems, [item.id]: true}})
Eran Hoặc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.