2016-03-26 29 views
10

Tôi đang học cách sử dụng react.js và có một số vấn đề để sử dụng trình xử lý sự kiện. Câu hỏi cuối cùng sẽ là: Có thể sử dụng hiển thị phía máy chủ và gửi trình xử lý sự kiện cho khách hàng một cách tự động không?React.js Hiển thị Serverside và Trình xử lý sự kiện

Dưới đây là ví dụ của tôi: Tôi có một index.jsx mà tôi làm cho phía máy chủ và gửi cho khách hàng

var React = require("react"); 
var DefaultLayout = require("./layout/default"); 

var LikeButton = React.createClass({ 
    getInitialState: function() { 
    return {liked: false}; 
    }, 
    handleClick: function(event) { 
    this.setState({liked: !this.state.liked}); 
    }, 
    render: function() { 
    var text = this.state.liked ? 'like' : 'haven\'t liked'; 
    return (
     <p onClick={this.handleClick}> 
     You {text} this. Click to toggle. 
     </p> 
    ); 
    } 
}); 

var IndexComponent = React.createClass({ 
    render: function(){ 
     return (
      <DefaultLayout title={this.props.name}> 
       <div> 
         <h1>React Test</h1> 
       </div> 

       <div id="testButton"> 
        <LikeButton/> 
       </div> 

       <script type="text/babel" src="/js/react.js"></script> 
      </DefaultLayout> 
     ) 
    } 
}); 

Nhưng "Like Button" không có bất kỳ sự tương tác. Để làm cho nó làm một cái gì đó trên nhấp chuột tôi phải thêm phía khách hàng mã này.

var LikeButton = React.createClass({ 
    getInitialState: function() { 
    return {liked: false}; 
    }, 
    handleClick: function(event) { 
    this.setState({liked: !this.state.liked}); 
    }, 
    render: function() { 
    var text = this.state.liked ? 'like' : 'haven\'t liked'; 
    return (
     <p onClick={this.handleClick}> 
     You {text} this. Click to toggle. 
     </p> 
    ); 
    } 
}); 

ReactDOM.render(
    <LikeButton />, 
    document.getElementById('testButton') 
); 

Tôi chỉ mới bắt đầu với react.js và có thể tôi chỉ thiếu một số khái niệm chính ở đây. Nhưng tại sao react.js không chỉ tạo mã (mà bây giờ tôi phải thêm thủ công cho máy khách) khi render phía máy chủ trang? Như thế này, tôi có mã dự phòng và nó cảm thấy như thế này sẽ là một mớ hỗn độn trong các ứng dụng lớn hơn. Ít nhất react.js đủ thông minh để không vẽ hai nút LikeButton nhưng để "liên kết" phía máy chủ được tạo ra với thành phần phía máy khách.

+0

Điều này không liên quan đến câu hỏi của bạn nhưng tôi tin rằng bạn phải ràng buộc hàm handleClick trước khi chuyển nó lên onClick nếu không nó không có ngữ cảnh chính xác về điều này. (Nhưng tôi không chắc chắn lý do tại sao bạn sẽ không nhận được lỗi khi bạn nhấp vào nút vì nó sẽ ném một lỗi khi gọi this.setState) –

+2

@ ktruong ràng buộc là không cần thiết khi sử dụng React.createClass. nó tự động liên kết. –

+1

@ jeffpc1993 Ohh cảm ơn vì đã chỉ ra điều đó! –

Trả lời

12

Đối với ứng dụng React tương tác phía khách hàng, bạn cũng cần phải hiển thị phía ứng dụng khách. Thông thường, mã này giống với mã bạn chạy trên máy chủ, do đó không có mã dự phòng. Nó chỉ là cùng một mã. Bạn có thể tự hỏi mình nếu việc hiển thị trên cả máy khách và máy chủ có thể quá mức cần thiết, nhưng từ quan điểm hiệu suất và SEO, nó có ý nghĩa hoàn hảo.

ReactDOMServer.renderToString(<MyApp foo={bar} />) về cơ bản chỉ hiển thị chuỗi có đánh dấu. Không có javascript hoặc bất kỳ ma thuật nào xảy ra ở đó. Chỉ đơn giản là HTML cũ. Tuy nhiên, đánh dấu kết xuất có rất nhiều thuộc tính ID phản hồi mà sau này được sử dụng trên máy khách để tạo ra các sự kiện ảo DOM ban đầu và đính kèm.

Khi bạn hiển thị lại ứng dụng của mình trên máy khách, trên cùng một phần tử DOM trong đó đánh dấu kết xuất phía máy chủ của bạn đã được tiêm trên máy chủ, React không cần vẽ lại toàn bộ ứng dụng. Nó chỉ tạo một cây DOM ảo mới, phân biệt nó với cây DOM ảo ban đầu và thực hiện các hoạt động DOM cần thiết, nếu có. Khái niệm này của DOM ảo là thứ làm cho React trở nên nhanh như vậy ngay từ đầu. Trong cùng một quy trình, mọi trình lắng nghe sự kiện bạn đã xác định trong ứng dụng của bạn sẽ được đính kèm với đánh dấu đã được hiển thị.

Tất cả điều này xảy ra rất nhanh. Và bạn có lợi ích của trang được hiển thị trên máy chủ (có thể được lưu trữ trên máy chủ, sử dụng Varnish hoặc một cái gì đó tương tự) mà công cụ tìm kiếm sẽ thu thập thông tin, người dùng không cần đợi bất kỳ thứ gì để xem kết xuất ban đầu và trang về cơ bản hoạt động cho người dùng đã tắt javascript.

+0

Cảm ơn câu trả lời của bạn. Bạn có biết bài viết hay để sử dụng React with Varnish? –

21

Hành vi này là do chính xác kết quả của phía máy chủ là gì. Trước tiên, bạn sẽ phải chạy chính mã giống nhau ở cả phía máy khách và phía máy chủ. Đây là cái được gọi là ứng dụng đẳng cấu. Một chạy trên cả máy chủ và máy khách.
Vì vậy, khi thực hiện ReactDOM.renderToString(<Component>) chỉ HTML được hiển thị dưới dạng chuỗi. Phương thức kết xuất của thành phần của bạn được đánh giá và HTML được yêu cầu cho hiển thị ban đầu được tạo.
Khi cùng một mã được chạy trên máy khách, phản ứng tra cứu HTML được hiển thị và đính kèm JS ở những nơi bắt buộc. React là thông minh theo cách này, nó không tái render mọi thứ một lần nữa ở phía khách hàng. Chỉ cần đánh giá mã và xác định nơi tất cả để đính kèm mã dựa trên react-id mỗi phần tử DOM được cung cấp. (Bạn sẽ phản ứng-id nếu bạn kiểm tra yếu tố bất kỳ ứng dụng phản ứng)

Bây giờ người ta có thể hỏi lợi ích của việc hiển thị cùng một điều hai lần là gì?
và câu trả lời là perceived loading time bởi người dùng. Và cũng có một số xem tối thiểu cho người dùng đã tắt JS.

Ứng dụng khách được hiển thị
Đây là cách ứng dụng được hiển thị của ứng dụng khách. (Khách hàng trả lại Phản ứng ứng dụng quá)

client rendered app

Những thành viên sẽ chỉ nhìn thấy nội dung sau khi tất cả HTML xương, bó JS (mà thường là khá lớn), và dữ liệu được nạp và đánh giá. Điều này có nghĩa là người dùng sẽ thường phải nhìn chằm chằm vào màn hình xoay hoặc tải trong một thời gian cho đến khi mọi thứ tải.

đẳng cấu ứng dụng (chạy cả trên client và server)
Làm thế nào một ứng dụng đẳng cấu công trình,
server rendered app
Trong trường hợp này, máy chủ tạo ra đầy đủ HTML bằng cách đánh giá thành phần của bạn. Và người dùng sẽ thấy nội dung ngay lập tức ngay khi HTML được tải xuống. Mặc dù ứng dụng sẽ chỉ hoạt động đầy đủ sau khi các gói JS cũng được tải xuống và đánh giá. Vì vậy, JS phải chạy trên cả hai mặt
Do đó, người dùng thấy nội dung nhanh hơn nhiều so với trước đây. Do đó giảm đáng kể thời gian tải nhận thức.

+7

Tôi đã đánh dấu câu trả lời @dannyjolie là chính xác vì nó trả lời câu hỏi của tôi và đã được đăng trước đó. Nhưng vẫn còn một lời cảm ơn lớn đến nỗ lực của bạn để trả lời câu hỏi của tôi. Nó cũng đã giúp tôi rất nhiều để hiểu rõ hơn về cách hoạt động của react.js và khái niệm nào sau đó! – Jodo

Các vấn đề liên quan