Tôi cố gắng sử dụng ref ít nhất có thể, nhưng có vẻ như không có cách nào xung quanh nó để gọi các phương thức dom (focus(), reset(), blur() v.v.) với. Trừ, tôi muốn sử dụng các chức năng thành phần không quốc tịch cho những thứ cơ bản như đầu vào biểu mẫu, khi nó đứng, các thành phần không trạng thái này không cho phép ref trỏ đến chúng (chúng sẽ trả về null). Tôi hiểu rằng tôi có thể thêm một wrapper thành phần lớp React thường xuyên xung quanh thành phần không trạng thái để cho phép ReactDOM.findDOMNode (ref) hoạt động chính xác, nhưng điểm nào có chức năng không trạng thái nếu nó luôn luôn được bao bọc? Tui bỏ lỡ điều gì vậy?Có thể gọi các phương thức phần tử dom như focus() mà không sử dụng ref? (Sử dụng các hàm thành phần không có trạng thái)
Trả lời
Đây là giải pháp mà tôi đã đưa ra mà không yêu cầu gói thành phần không trạng thái trong một lớp học. Thay vào đó, nó liên quan đến việc cha mẹ chuyển một hàm tới thành phần không trạng thái như một nhánh được sử dụng như hàm gọi lại cho ref trên phần tử DOM.
Trước tiên hãy đặt một phương thức trên phụ huynh trạng thái sẽ được sử dụng làm gọi lại cho ref và phương thức khác để thực hiện hành động trên phần tử DOM (trong trường hợp này tập trung sau khi nhấn phím). Sau đó gửi phương thức cho đứa trẻ không quốc tịch như một biện pháp chống đỡ.
// note: Facebook now recommends using native js classes instead of React.createClass().
// note 2: You may need Babel to transpile some of ES6 syntax in use here.
const StatefulParent = React.createClass({
getInitialState() {
return {
// doesn't matter for this example
}
},
componentDidMount() {
document.addEventListener('keyup', this.keyUp, false)
},
keyUp() {
// calls the DOM focus method on the input when the 'tab' key is pressed
if (e.keyCode === 9) this._input.focus()
},
inputSetter(ref) {
this._input = ref
},
render() {
<StatelessTextInput {...this.state} refCallback={this.inputSetter} />
}
})
Thành phần không trạng thái giả định phương thức sẽ được chuyển đến phương thức đó từ cha mẹ được gọi là refCallback. Prop này có thể được truyền qua bất kỳ số lượng các thế hệ thành phần nào để đạt được phần tử DOM.
const StatelessTextInput = ({refCallback, ...props}) => (
<input {...props} ref={refCallback} />
)
Chỉ cần bọc thành phần không trạng thái của bạn với thành phần lớp (es6) đính kèm ref. Nó được viết trong official docs
Chắc chắn nhưng điểm tạo ra chức năng không quốc tịch là gì nếu bạn phải quấn nó trong một lớp học? Cũng có thể chỉ cần sử dụng một lớp học để bắt đầu trong trường hợp đó. –
Các chức năng không quốc tịch giống như các chức năng thuần túy và sử dụng cho mục đích trình bày. Chỉ cần lấy các đạo cụ và render xem mà không có bất kỳ tác dụng phụ. Vì vậy, nếu thành phần của bạn cần một số hành vi không tầm thường, đó là thời gian để trích xuất thành phần lớp. – andreo
Giải pháp sạch nhất tôi tìm thấy là đặt biến cục bộ và sau đó gán cho nó. Sau đó, điều này có thể được truy cập và tập trung khi cần thiết:
const Item =() => {
let input;
const click =() => {
if (input){
input.focus();
}
};
return (
<div>
<a href="#" onClick={click}>clickMe</a>
<input ref={e => (input = e)}/>
</div>
);
};
Vâng, điều đó rất dễ dàng nếu bạn đang phát hành lại một phần tử html trong phần cha mẹ trực tiếp của nó. Nhưng nếu có một mức độ tách biệt khác (một ông bà cần ref của một đứa cháu) và thành phần ở giữa (cha mẹ) là một chức năng không quốc tịch ... đó là kịch bản tôi đưa ra. –
có, chỉ nhớ nó trong khi hiển thị và mang nó ra, và tập trung vào nó sau khi hiển thị:
function Main(props) {
<input ref={e => { props.elems.input = e; }}
}
const elems = {};
ReactDOM.render(Main({ elems }), containerElement);
elems.input.focus();
Chỉ có vấn đề này quá với một thành phần không trạng thái. Ít nhất là React v16, bạn có thể tham khảo phần tử như thế này:
<Button
onClick={(el) => {
el.target.blur();
}}>
Button Text
</Button>
- 1. Có thể sử dụng ActionLink có chứa phần tử không?
- 2. Không cần trạng thái trong các thành phần React nếu sử dụng Redux và React-Redux?
- 3. Trạng thái xuất các phần tử tùy chỉnh aurelia thành các thành phần web là gì?
- 4. Tôi có thể sử dụng lại các thành phần trên các ứng dụng không?
- 5. Tôi có nên sử dụng ref hoặc findDOMNode để nhận nút phản ứng gốc của một phần tử không?
- 6. Sử dụng trạng thái hoặc tham chiếu trong các thành phần biểu mẫu React.js?
- 7. Tôi có thể sử dụng các phương thức cá thể riêng làm gọi lại không?
- 8. Có thư viện các thành phần iPhone có thể tái sử dụng trên web không?
- 9. Có lý do nào mà mọi người thích sử dụng hàm tạo của thành phần React thay vì componentWillMount không?
- 10. Tôi có nên sử dụng các hàm sẵn sàng DOM nếu tập lệnh của tôi ở cuối phần thân không?
- 11. Sử dụng các thành phần của khung công tác Zend mà không có khung thực tế?
- 12. Các thành phần gọi món là gì? Tôi có nên sử dụng nó không?
- 13. Có thể sử dụng Uri.Builder và không có phần "//" không?
- 14. xoá các phần tử DOM không sử dụng cho hiệu suất
- 15. Tôi có thể sử dụng các đơn vị hỗn hợp với phần tử 'đường dẫn' không?
- 16. Sử dụng đối tượng phần tử với phương thức jQuery?
- 17. Có thể sử dụng React.render() nhiều lần trong DOM không?
- 18. Không thể sử dụng các hàm Arrow bên trong lớp thành phần phản ứng
- 19. Các phần tử giả có thể được sử dụng một mình trong CSS không?
- 20. Tôi có thể sử dụng các phần tử từ điển làm đối tượng khóa không?
- 21. Hàm jQuery ready() có thể được sử dụng hai lần cho cùng một phần tử không?
- 22. "Các thành phần chức năng phi trạng thái không thể được đưa ra" là gì?
- 23. Namespaces Lấy từ phần tử trong Java (sử dụng DOM)
- 24. Có thể áp dụng một hàm chung cho các phần tử tuple không?
- 25. Cú pháp hàm mũi tên trong các thành phần không trạng thái phản ứng
- 26. Có ai sử dụng thành công COM không đăng ký với các thành phần .NET không?
- 27. Tôi có sử dụng đúng thành phần chức năng không?
- 28. Thêm các phần tử vào DOM cho HTML thuần văn bản chỉ sử dụng JavaScript thuần túy (không có jQuery)
- 29. Có thể sử dụng hoạt ảnh khung hình chính thành phần tử giả không?
- 30. phản ứng: Gọi phương thức của thành phần con từ thành phần gốc
Cảm ơn bạn! Điều này rất hữu ích! –